浏览代码

LibC+Userland: Prefer snprintf over sprintf

I ignored the sprintf in Userland/cal.cpp because it's too much trouble.
However, this only underlines the need for bounds checking.
Ben Wiederhake 4 年之前
父节点
当前提交
4f77ccbda8
共有 2 个文件被更改,包括 7 次插入3 次删除
  1. 3 1
      Libraries/LibC/netdb.cpp
  2. 4 2
      Userland/seq.cpp

+ 3 - 1
Libraries/LibC/netdb.cpp

@@ -100,7 +100,9 @@ hostent* gethostbyname(const char* name)
 {
     auto ipv4_address = IPv4Address::from_string(name);
     if (ipv4_address.has_value()) {
-        sprintf(__gethostbyname_name_buffer, "%s", ipv4_address.value().to_string().characters());
+        auto ip4_string = ipv4_address.value().to_string();
+        ASSERT(ip4_string.length() < sizeof(__gethostbyname_name_buffer));
+        strncpy(__gethostbyname_name_buffer, ip4_string.characters(), ip4_string.length());
         __gethostbyname_buffer.h_name = __gethostbyname_name_buffer;
         __gethostbyname_buffer.h_aliases = nullptr;
         __gethostbyname_buffer.h_addrtype = AF_INET;

+ 4 - 2
Userland/seq.cpp

@@ -35,7 +35,7 @@ static double get_double(const char* name, const char* d_string, int* number_of_
     char* end;
     double d = strtod(d_string, &end);
     if (d == 0 && end == d_string) {
-        fprintf(stderr, "%s: invalid double vallue \"%s\"\n", name, d_string);
+        fprintf(stderr, "%s: invalid double value \"%s\"\n", name, d_string);
         exit(1);
     }
     if (char* dot = strchr(d_string, '.'))
@@ -95,7 +95,7 @@ int main(int argc, const char* argv[])
     double d = start;
     for (int i = 0; i <= n; ++i) {
         char buf[40];
-        sprintf(buf, "%f", d); // FIXME: Serenity's printf() doesn't seem to handle %f correctly: For `seq 1 0.1 2` this always prints "1.0" as `d` goes from 1.0 to 2.0.
+        snprintf(buf, sizeof(buf), "%f", d);
         if (char* dot = strchr(buf, '.')) {
             if (number_of_decimals == 0)
                 *dot = '\0';
@@ -105,4 +105,6 @@ int main(int argc, const char* argv[])
         printf("%s\n", buf);
         d += step;
     }
+
+    return 0;
 }