Search
j0ke.net Open Build Service
>
Projects
>
server:pxe
>
tftp-hpa
> tftp-hpa-filecase.diff
Sign Up
|
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File tftp-hpa-filecase.diff of Package tftp-hpa
--- tftp-hpa-5.0/tftpd/tftpd.c.orig 2009-02-16 23:51:22.000000000 +0100 +++ tftp-hpa-5.0/tftpd/tftpd.c 2009-05-02 19:56:19.000000000 +0200 @@ -46,6 +46,7 @@ #include <pwd.h> #include <limits.h> #include <syslog.h> +#include <dirent.h> #include "common/tftpsubs.h" #include "recvfrom.h" @@ -976,6 +977,9 @@ static void tftp_sendfile(struct formats *, struct tftphdr *, int); static void tftp_recvfile(struct formats *, struct tftphdr *, int); +int lookup_entry(const char *comp, char *dest); +void lookup_file(char *filename); + struct formats { const char *f_mode; char *(*f_rewrite) (char *, int, const char **); @@ -1353,6 +1357,62 @@ } #endif +int lookup_entry(const char *comp, char *dest) +{ + DIR *dirp; + struct dirent *dptr; + dirp = opendir(dest[0] ? dest : "."); + if (!dirp) return 0; + while ((dptr = readdir(dirp))) + { + if (!strcasecmp(dptr->d_name, comp)) + { + if (dest[0]) strcat(dest, "/"); + strcat(dest, dptr->d_name); + closedir(dirp); + return 1; + } + } + closedir(dirp); + return 0; +} + + +void lookup_file(char *filename) +{ + int found = 0; + int len = 0; + char dest[1024]; + char comp[1024]; + char *check = filename; + char *seek = NULL; + + dest[0] = 0; + check++; + while (*check) + { + seek = strchr(check, '\\'); + if (!seek) + { + if ((*check) && (lookup_entry(check, dest))) + found = 1; + break; + } + len = seek - check; + memcpy(comp, check, len); + comp[len]=0; + if (!lookup_entry(comp, dest)) + break; + check += len + 1; + } + + if (found) + { + filename[0] = 0; + strcat(filename, dest); + } +} + static FILE *file; /* * Validate file access. Since we @@ -1378,6 +1438,8 @@ tsize_ok = 0; *errmsg = NULL; + if (*filename == '\\') lookup_file(filename); + if (!secure) { if (*filename != '/') { *errmsg = "Only absolute filenames allowed";