Erroneous use of getcwd on lib/nspath.c
Andreas Ericsson
ae at op5.se
Fri Oct 26 18:10:16 CEST 2012
Good thing I read the mail before I submitted my previous code.
This looks good. Thanks.
On 10/26/2012 05:23 PM, Ricardo Jose Maraschini wrote:
> * Ricardo Jose Maraschini (ricardo.maraschini at opservices.com.br) wrote:
>> * 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.
>>
>
> Sorry, wrong patch, here goes the right one.
>
> ===================================================================
> --- 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/
> _______________________________________________
> Nagios-devel mailing list
> Nagios-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/nagios-devel
>
--
Andreas Ericsson andreas.ericsson at op5.se
OP5 AB www.op5.se
Tel: +46 8-230225 Fax: +46 8-230231
Considering the successes of the wars on alcohol, poverty, drugs and
terror, I think we should give some serious thought to declaring war
on peace.
------------------------------------------------------------------------------
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