Openwall GNU/*/Linux - a small security-enhanced Linux distro for servers
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date: Mon, 18 Mar 2013 15:40:54 -0500
From: "jfoug" <jfoug@....net>
To: <john-dev@...ts.openwall.com>
Subject: basename portability 'fix'.

Here is a proper running basename.  I build both a 'normal' basename, and a
thread safe one.  The 'normal' one, simply has a static buffer that it
passes into the thread safe one.    the reason for the buffer, is I chose to
have the name param be a const char *.  Some basename's have only a char *,
and document that the function can mess with the param. BBAAADDDD, but they
do that.   Looking at many implementations of basename, it looks like about
50% of them have very bad side effects, or simply do not work properly.

 

Here is the function proto's  (I put these into misc.c/h

 

char *jtr_basename(const char *name)

char *jtr_basename_r(const char *name, char *buf)  (buf must be
strlen(name)+1, but PATH_BUFFER_SIZE+1 can also be used.

 

Here are the 'rules'

 

a null name, or name pointing to a length 0 string  returns "."

Both Win32 ('\\') and unix ('/') separator chars are handled.  In unix
builds, only the / is handled. In win32, 'both' are handled, since they
actually mean the same thing.

if string is only / or \ chars, then a single / or \ will be returned.

Win32/DOS drive letters are handled.  NOTE, a C: by itself, is treated like
a string of length 0, and returns "."

Trailing / or \ are removed from final basename, IIF there is a basename.

 

This is made against bleeding (since a code freeze is on, I think on the new
jumbo).  It likely will patch to the jumbo easily, IF someone wants to do
that also.

 

 

To use this, simply do this:

 

#include "misc.h"

 

char *p = jtr_basename(fullname);

 

To  use this IF there were in code that had to be thread safe, the
jtr_basename_r() function could be used.  I do not foresee that need
currently, but it is there, since this function needs either a static
buffer, OR needs the input parameter to be able to be destroyed.

 

Jim.

 

 


Content of type "text/html" skipped

Download attachment "bleeding_basename_portability_fix.patch" of type "application/octet-stream" (5763 bytes)

Powered by blists - more mailing lists

Your e-mail address:

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.