From 00a357994077fc20ddf0ff8c4199e54d52350f2c Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 8 Mar 2014 22:21:04 +0100 Subject: [PATCH] Fix basename(3) and dirname(3) returning incorrect strings. --- libc/libgen/basename.cpp | 2 +- libc/libgen/dirname.cpp | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libc/libgen/basename.cpp b/libc/libgen/basename.cpp index 4ad8e4a1..844148ee 100644 --- a/libc/libgen/basename.cpp +++ b/libc/libgen/basename.cpp @@ -36,7 +36,7 @@ extern "C" char* basename(char* path) path[--path_len] = '\0'; if ( strcmp(path, "/") == 0 ) return path; - char* last_slash = strchr(path, '/'); + char* last_slash = strrchr(path, '/'); if ( !last_slash ) return path; return last_slash + 1; diff --git a/libc/libgen/dirname.cpp b/libc/libgen/dirname.cpp index 1379d274..05bdd0b0 100644 --- a/libc/libgen/dirname.cpp +++ b/libc/libgen/dirname.cpp @@ -36,9 +36,13 @@ extern "C" char* dirname(char* path) path[--path_len] = '\0'; if ( strcmp(path, "/") == 0 ) return path; - char* last_slash = strchr(path, '/'); - if ( !last_slash ) - return dirname(NULL); - *last_slash = '\0'; + if ( !strchr(path, '/') ) + return (char*) current_directory; + while ( 1 <= path_len && path[path_len-1] != '/' ) + path[--path_len] = '\0'; + while ( 1 <= path_len && path[path_len-1] == '/' ) + path[--path_len] = '\0'; + if ( !path[0] ) + strcpy(path, "/"); return path; }