Erroneous use of getcwd on lib/nspath.c

Ricardo Jose Maraschini ricardo.maraschini at opservices.com.br
Fri Oct 26 17:16:54 CEST 2012


* Ricardo Jose Maraschini (ricardo.maraschini at opservices.com.br) wrote:
> 
> Accordingly to manpages and some home made tests, getcwd returns NULL
> when an error occurs, not a value < 0.
> 
> Following, on openbsd MAX_PATH is 1024 bytes while in linux it is 4096
> bytes, so i thought it would be ok to include <limits.h> and use macro
> MAX_PATH, not a fixed size of 4096.
> 
> Also we don't need to make sizeof(path) - 1 when calling getcwd.
> Quoting manpage:
> 
> "The size argument is the size, in bytes, of the array referenced by
> buf."
> 
> Is it sounds resonable?
> Comments?

I keep trolling nagios and discovered that it segfaults, or, as the code
states "256 components will fail hard" with a configuration path with 
more than 256 directories.

I know that a configuration with more than 256 directories is, above
all, stupid, but i do prefer to have it working even if the
administrator isn't so much clever.

So, the previous patch may be ignored cause it's included on this.

===================================================================
--- lib/nspath.c	(revision 2409)
+++ lib/nspath.c	(working copy)
@@ -5,6 +5,7 @@
 #include <string.h>
 #include <sys/types.h>
 #include <stdio.h>
+#include <limits.h>
 #include "nspath.h"
 
 #ifndef PATH_MAX
@@ -64,7 +65,7 @@
  */
 char *nspath_normalize(const char *orig_path)
 {
-	struct pcomp pcomp[256]; /* >256 components will fail hard */
+	struct pcomp *pcomp = NULL;
 	int comps, i = 0, m, depth = 0;
 	char *path, *rpath, *p, *slash;
 
@@ -73,7 +74,10 @@
 
 	rpath = strdup(orig_path);
 	comps = path_components(rpath);
-	memset(pcomp, 0, sizeof(pcomp));
+	pcomp = calloc(comps,sizeof(struct pcomp));
+	if (pcomp == NULL)
+		return NULL;
+
 	p = pcomp[0].str = rpath;
 	for (; p; p = slash, i++) {
 		slash = strchr(p, '/');
@@ -114,12 +118,13 @@
 
 	path = pcomp_construct(pcomp, comps);
 	free(rpath);
+	free(pcomp);
 	return path;
 }
 
 char *nspath_absolute(const char *rel_path, const char *base)
 {
-	char cwd[4096];
+	char *cwd[PATH_MAX];
 	int len;
 	char *path = NULL, *normpath;
 
@@ -127,7 +132,7 @@
 		return nspath_normalize(rel_path);
 
 	if (!base) {
-		if (getcwd(cwd, sizeof(cwd) - 1) < 0)
+		if (getcwd(cwd, sizeof(cwd)) == NULL)
 			return NULL;
 		base = cwd;
 	}

------------------------------------------------------------------------------
The Windows 8 Center 
In partnership with Sourceforge
Your idea - your app - 30 days. Get started!
http://windows8center.sourceforge.net/
what-html-developers-need-to-know-about-coding-windows-8-metro-style-apps/




More information about the Developers mailing list