| ... | ... |
@@ -126,10 +126,11 @@ static char * |
| 126 | 126 |
retry_realpath(const char *file_name) |
| 127 | 127 |
{
|
| 128 | 128 |
char *r, p[PATH_MAX] = {'\0'}, *x;
|
| 129 |
+ int fnlen; |
|
| 129 | 130 |
if(file_name == NULL) {
|
| 130 | 131 |
errno = EINVAL; |
| 131 | 132 |
return NULL; |
| 132 |
- } else if(strlen(file_name) >= PATH_MAX) {
|
|
| 133 |
+ } else if((fnlen = strlen(file_name)) >= PATH_MAX) {
|
|
| 133 | 134 |
errno = ENAMETOOLONG; |
| 134 | 135 |
return NULL; |
| 135 | 136 |
} |
| ... | ... |
@@ -137,6 +138,10 @@ retry_realpath(const char *file_name) |
| 137 | 138 |
/* TODO: use a macro instead of '/' for absolute path first character so that other systems can work */ |
| 138 | 139 |
/* if a relative path, prepend cwd */ |
| 139 | 140 |
getcwd(p, sizeof(p)); |
| 141 |
+ if(strlen(p) + strlen(DIR_SEP_STR) + fnlen >= PATH_MAX) {
|
|
| 142 |
+ errno = ENAMETOOLONG; |
|
| 143 |
+ return NULL; |
|
| 144 |
+ } |
|
| 140 | 145 |
strcat(p, DIR_SEP_STR); /* TODO: use a macro instead of '/' for the path delimiter */ |
| 141 | 146 |
} |
| 142 | 147 |
strcat(p, file_name); |