]> git.itanic.dy.fi Git - rrdd/blobdiff - plugin_manager.c
Fix possible buffer overrun due to incorrect strncat length argument
[rrdd] / plugin_manager.c
index 6ddac4cda4bf3ff3130a21bccd24e333af54ed3b..e91698090613eaf696dabaecbbd764bda15b56e4 100644 (file)
@@ -80,14 +80,16 @@ int load_parser_plugin(const char *name)
        int ret;
 
        strncpy(str, name, sizeof(str));
-       strncat(str, parser, sizeof(str) - 1);
+       str[sizeof(str) - 1] = '\0';
+       strncat(str, parser, sizeof(str) - strlen(str) - 1);
        ret = load_plugin(str);
        if (!ret)
                return 0;
 
        strncpy(str, "./", sizeof(str));
-       strncat(str, name, sizeof(str) - 1);
-       strncat(str, parser, sizeof(str) - 1);
+       str[sizeof(str) - 1] = '\0';
+       strncat(str, name, sizeof(str) - strlen(str) - 1);
+       strncat(str, parser, sizeof(str) - strlen(str) - 1);
        ret = load_plugin(str);
        if (!ret)
                return 0;
@@ -96,8 +98,9 @@ int load_parser_plugin(const char *name)
                return 0;
 
        strncpy(str, exec_path, sizeof(str));
-       strncat(str, "/", sizeof(str) - 1);
-       strncat(str, name, sizeof(str) - 1);
-       strncat(str, parser, sizeof(str) - 1);
+       str[sizeof(str) - 1] = '\0';
+       strncat(str, "/", sizeof(str) - strlen(str) - 1);
+       strncat(str, name, sizeof(str) - strlen(str) - 1);
+       strncat(str, parser, sizeof(str) - strlen(str) - 1);
        return load_plugin(str);
 }