Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r83889 - trunk/tools/build/v2/engine
From: steven_at_[hidden]
Date: 2013-04-13 20:09:22


Author: steven_watanabe
Date: 2013-04-13 20:09:21 EDT (Sat, 13 Apr 2013)
New Revision: 83889
URL: http://svn.boost.org/trac/boost/changeset/83889

Log:
Revert [80304]. It's badly broken. (a) the buffer size is wrong, and (b) strncpy is the wrong function here.
Text files modified:
   trunk/tools/build/v2/engine/jam.c | 38 +++-----------------------------------
   1 files changed, 3 insertions(+), 35 deletions(-)

Modified: trunk/tools/build/v2/engine/jam.c
==============================================================================
--- trunk/tools/build/v2/engine/jam.c (original)
+++ trunk/tools/build/v2/engine/jam.c 2013-04-13 20:09:21 EDT (Sat, 13 Apr 2013)
@@ -630,8 +630,6 @@
     return strdup( getexecname() );
 }
 #elif defined(__FreeBSD__)
-# include <stdlib.h>
-# include <string.h>
 # include <sys/sysctl.h>
 char * executable_path( char const * argv0 )
 {
@@ -639,45 +637,15 @@
     char buf[ 1024 ];
     size_t size = sizeof( buf );
     sysctl( mib, 4, buf, &size, NULL, 0 );
- if ( size && size != sizeof( buf ) )
- {
- /* Using strndup() here might not work with older glibc installations as
- * their headers do not declare that function unless certain symbols are
- * defined. We could work around this issue by defining appropriate
- * symbols but they depend on the exact glibc version used so simply
- * using malloc()/strncpy() seems like a cleaner solution.
- *
- * Note: such old glibc installations have so far only been found on
- * Linux and not Free-BSD installations but using the same logic on
- * Free-BSD seems like something that could not hurt.
- */
- char * const result = (char *)malloc( size );
- if ( result )
- return strncpy( result, buf, size );
- }
- return NULL;
+ return ( !size || size == sizeof( buf ) ) ? NULL : strndup( buf, size );
 }
 #elif defined(__linux__)
-# include <stdlib.h>
-# include <string.h>
 # include <unistd.h>
 char * executable_path( char const * argv0 )
 {
     char buf[ 1024 ];
- ssize_t const size = readlink( "/proc/self/exe", buf, sizeof( buf ) );
- if ( size && size != sizeof( buf ) )
- {
- /* Using strndup() here might not work with older glibc installations as
- * their headers do not declare that function unless certain symbols are
- * defined. We could work around this issue by defining appropriate
- * symbols but they depend on the exact glibc version used so simply
- * using malloc()/strncpy() seems like a cleaner solution.
- */
- char * const result = (char *)malloc( size );
- if ( result )
- return strncpy( result, buf, size );
- }
- return NULL;
+ ssize_t const ret = readlink( "/proc/self/exe", buf, sizeof( buf ) );
+ return ( !ret || ret == sizeof( buf ) ) ? NULL : strndup( buf, ret );
 }
 #else
 char * executable_path( char const * argv0 )


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk