AmendHub

jcs

/

subtext

/

amendments

/

209

*: Move some big char buffers from the stack to the heap

Use FILENAME_MAX in place of 256 where appropriate.

jcs made amendment 209 6 months ago
--- folder.c Tue Jul 12 23:32:16 2022 +++ folder.c Fri Jul 15 23:22:49 2022 @@ -344,13 +344,12 @@ unsigned long folder_upload(struct session *s, struct folder *folder, char *initial_filename, char *initial_description) { - char upload_path[256] = { 0 }; struct folder_file file = { 0 }; FILE *fp; SHA1_CTX sha1; struct stat sb; struct zmodem_session *zs; - char *data = NULL, *tmp = NULL, *errorstr = NULL; + char *upload_path = NULL, *data = NULL, *tmp = NULL, *errorstr = NULL; size_t size; short c, n, ret, error; @@ -380,7 +379,8 @@ folder_upload(struct session *s, struct folder *folder session_flush(s); session_pause_return(s, 0, "when you are ready..."); - snprintf(upload_path, sizeof(upload_path), "%s:upload-%08lx%08lx", + upload_path = xmalloc(FILENAME_MAX); + snprintf(upload_path, FILENAME_MAX, "%s:upload-%08lx%08lx", folder->path, xorshift32(), xorshift32()); zs = ZCreateReceiver(s, upload_path); @@ -418,12 +418,13 @@ folder_upload(struct session *s, struct folder *folder session_printf(s, "\r\n\r\n"); if (stat(upload_path, &sb) != 0) { + session_log(s, "[%s] Failed receiving upload, no temp file", + folder->name); session_printf(s, "Failed receiving file, aborting.\r\n"); - session_pause_return(s, '\r', "to continue..."); + session_pause_return(s, CONTROL_C, "to continue..."); ZDestroy(zs); zs = NULL; - session_log(s, "[%s] Failed receiving upload, no temp file", - folder->name); + free(upload_path); return 0; } @@ -431,15 +432,13 @@ folder_upload(struct session *s, struct folder *folder session_log(s, "[%s] Received uploaded file of size %ld but " "supposed to be %ld, canceling", folder->name, sb.st_size, zs->file_size); - session_printf(s, "Uploaded file expected to be {{B}}%ld{{/B}} byte%s, but " "received\r\n" "{{B}}%ld{{/B}} byte%s. Deleting file and canceling upload.\r\n", zs->file_size, zs->file_size == 1 ? "" : "s", sb.st_size, sb.st_size == 1 ? "" : "s"); - session_pause_return(s, '\r', "to continue..."); - + session_pause_return(s, CONTROL_C, "to continue..."); ZDestroy(zs); zs = NULL; goto file_upload_cancel; @@ -638,7 +637,9 @@ file_upload_cancel: file_upload_done: if (file.notes) free(file.notes); - + if (upload_path != NULL) + free(upload_path); + return file.id; } @@ -654,13 +655,13 @@ folder_file_view(struct session *s, struct folder *fol { 'q', "QqXx", "Return to folder" }, { '?', "?", "List these options" }, }; - char path[256]; char time[32]; struct folder_file file; struct username_cache *uploader; struct zmodem_session *zs; struct session_menu_option *dopts = NULL; FILE *fp; + char *path = NULL; char prompt[6 + BOARD_NAME_LENGTH + 8]; size_t n, size; char c; @@ -721,7 +722,8 @@ folder_file_view(struct session *s, struct folder *fol switch (c) { case 'd': - snprintf(path, sizeof(path), "%s:%s", folder->path, + path = xmalloc(FILENAME_MAX); + snprintf(path, FILENAME_MAX, "%s:%s", folder->path, file.filename); fp = fopen(path, "rb"); if (!fp) { @@ -729,6 +731,7 @@ folder_file_view(struct session *s, struct folder *fol folder->name, path); session_printf(s, "{{B}}Error:{{/B}} Failed opening file\r\n"); + free(path); break; } @@ -766,6 +769,7 @@ folder_file_view(struct session *s, struct folder *fol } ZDestroy(zs); zs = NULL; + free(path); session_printf(s, "\r\n"); session_flush(s); @@ -895,7 +899,7 @@ bool folder_file_save(struct folder *folder, struct folder_file *file, char *temp_path) { - char new_name[256]; + char *new_name = NULL; short ret; char *data; size_t size; @@ -923,7 +927,8 @@ folder_file_save(struct folder *folder, struct folder_ bile_flush(folder->bile, true); - snprintf(new_name, sizeof(new_name), "%s:%s", folder->path, + new_name = xmalloc(FILENAME_MAX); + snprintf(new_name, FILENAME_MAX, "%s:%s", folder->path, file->filename); CtoPstr(temp_path); CtoPstr(new_name); @@ -934,9 +939,11 @@ folder_file_save(struct folder *folder, struct folder_ warn("FSRename(%s, 0, %s) failed: %d", temp_path, new_name, ret); bile_delete(folder->bile, FOLDER_FILE_RTYPE, file->id); file->id = 0; + free(new_name); return false; } + free(new_name); return true; } @@ -944,13 +951,14 @@ void folder_delete_file(struct session *s, struct folder *folder, struct folder_file *file) { - char path[256]; + char *path = NULL; short ret; bile_delete(folder->bile, FOLDER_FILE_RTYPE, file->id); bile_flush(folder->bile, true); - snprintf(path, sizeof(path), "%s:%s", folder->path, file->filename); + path = xmalloc(FILENAME_MAX); + snprintf(path, FILENAME_MAX, "%s:%s", folder->path, file->filename); CtoPstr(path); ret = FSDelete(path, 0); PtoCstr(path); @@ -959,6 +967,7 @@ folder_delete_file(struct session *s, struct folder *f session_log(s, "[%s] Failed deleting %s: %d", folder->name, path, ret); + free(path); if (file->notes != NULL) free(file->notes); --- folder.h Mon Jul 11 15:09:01 2022 +++ folder.h Fri Jul 15 23:36:48 2022 @@ -18,6 +18,7 @@ #define __FOLDER_H__ #include <stddef.h> +#include <stdio.h> #include "db.h" #include "sha1.h" @@ -31,7 +32,7 @@ struct folder { bool restricted_viewing; unsigned long last_upload_at; unsigned long file_count; - char path[256]; + char path[FILENAME_MAX]; struct bile *bile; }; --- main.c Thu Jun 30 15:51:33 2022 +++ main.c Fri Jul 15 22:33:17 2022 @@ -103,7 +103,7 @@ main(void) logger_printf(logger, "[db] Updating username cache"); user_cache_usernames(); logger_update_title(); - + if (db->config.telnet_port) telnet_init(); if (db->config.modem_port) @@ -256,10 +256,12 @@ handle_menu(long menu_id) case APPLE_MENU_ID: switch (LoWord(menu_id)) { case APPLE_MENU_ABOUT_ID: { - char vers_s[255]; + char *vers_s; + vers_s = xmalloc(100); sprintf(vers_s, "%s %s", PROGRAM_NAME, get_version(true)); note("%s", vers_s); + free(vers_s); ret = true; break; --- serial.c Wed Jul 13 10:04:04 2022 +++ serial.c Wed Jul 13 16:50:31 2022 @@ -47,7 +47,6 @@ #define baud38400 1 #endif - /* * The number of seconds after a RING that we'll allow a connection to * establish and a session to start, before we hang up and reset the --- session.h Tue Jul 12 11:27:29 2022 +++ session.h Fri Jul 15 22:42:37 2022 @@ -115,7 +115,7 @@ extern struct session_tally session_today_tally; struct session_menu_option { char ret; char key[15]; - char title[100]; + char title[50]; }; void session_load_tally(void); --- sha1.c Thu Jun 30 12:50:27 2022 +++ sha1.c Mon Jul 11 09:07:19 2022 @@ -119,7 +119,6 @@ SHA1Transform(u_int32_t state[5], const u_int8_t buffe void SHA1Init(SHA1_CTX *context) { - /* SHA1 initialization constants */ context->count[0] = 0; context->count[1] = 0; --- util.c Tue Jul 12 17:10:05 2022 +++ util.c Fri Jul 15 23:23:30 2022 @@ -598,9 +598,9 @@ getpath(short vRefNum, Str255 fileName, Str255 *ret, b WDPBRec wdir; HVolumeParam wvol; DirInfo wcinfo; - Str255 name; + char *name = NULL; size_t retlen = 0, len; - char tmpret[256], tmp[256]; + char *tmpret = NULL, *tmp = NULL; char *lastcolon; if (strchr((char *)fileName + 1, ':') != NULL) { @@ -615,35 +615,43 @@ getpath(short vRefNum, Str255 fileName, Str255 *ret, b return 0; } + name = xmalloc(FILENAME_MAX); + wdir.ioVRefNum = wdir.ioWDVRefNum = vRefNum; wdir.ioWDIndex = 0; wdir.ioWDProcID = 0; - wdir.ioNamePtr = (StringPtr)&name; + wdir.ioNamePtr = (StringPtr)name; if (PBGetWDInfo(&wdir, 0) != noErr) { warn("Failed looking up directory"); + free(name); return 1; } - wvol.ioNamePtr = (StringPtr)&name; + wvol.ioNamePtr = (StringPtr)name; wvol.ioVRefNum = vRefNum; wvol.ioVolIndex = 0; if (PBHGetVInfoSync((HParmBlkPtr)&wvol) != noErr) { warn("Failed getting volume info"); + free(name); return 1; } if (wvol.ioVSigWord != 0x4244) { warn("Unknown filesystem type 0x%x", wvol.ioVSigWord); + free(name); return 1; } wcinfo.ioVRefNum = vRefNum; - wcinfo.ioNamePtr = (StringPtr)&name; + wcinfo.ioNamePtr = (StringPtr)name; wcinfo.ioFDirIndex = -1; wcinfo.ioDrParID = wdir.ioWDDirID; wcinfo.ioDrDirID = wdir.ioWDDirID; + tmp = xmalloc(FILENAME_MAX); + tmpret = xmalloc(FILENAME_MAX); + /* go backwards, prepending each folder's parent */ while (wcinfo.ioDrParID != 1) { wcinfo.ioDrDirID = wcinfo.ioDrParID; /* .. */ @@ -655,10 +663,10 @@ getpath(short vRefNum, Str255 fileName, Str255 *ret, b PtoCstr(name); if (retlen == 0) { retlen = len; - strlcpy(tmpret, (char *)name, sizeof(tmpret)); + strlcpy(tmpret, (char *)name, FILENAME_MAX); } else { - strlcpy(tmp, tmpret, sizeof(tmp)); - snprintf(tmpret, sizeof(tmpret), "%s:%s", name, tmp); + strlcpy(tmp, tmpret, FILENAME_MAX); + snprintf(tmpret, FILENAME_MAX, "%s:%s", name, tmp); } } @@ -667,19 +675,25 @@ getpath(short vRefNum, Str255 fileName, Str255 *ret, b memcpy(name, fileName, sizeof(name)); PtoCstr(name); if (retlen == 0) - strlcpy(tmpret, (char *)name, sizeof(tmpret)); + strlcpy(tmpret, name, FILENAME_MAX); else { - strlcat(tmpret, ":", sizeof(tmpret)); - strlcat(tmpret, (char *)name, sizeof(tmpret)); + strlcat(tmpret, ":", FILENAME_MAX); + strlcat(tmpret, name, FILENAME_MAX); } } else if (retlen == 0) { (*ret)[0] = 0; + free(tmp); + free(tmpret); + free(name); return 0; } CtoPstr(tmpret); memcpy(*ret, tmpret, sizeof(tmpret)); - + free(tmp); + free(tmpret); + free(name); + return 0; } @@ -817,7 +831,7 @@ copy_file(Str255 source, Str255 dest, bool overwrite) OSErr copy_file_contents(short source_ref, short dest_ref) { - char buf[1024]; + char *buf; short error; long source_size, count; @@ -831,18 +845,23 @@ copy_file_contents(short source_ref, short dest_ref) error = SetFPos(dest_ref, fsFromStart, 0); if (error) return error; + + buf = xmalloc(1024); + while (source_size > 0) { - count = sizeof(buf); + count = 1024; if (count > source_size) count = source_size; - error = FSRead(source_ref, &count, &buf); + error = FSRead(source_ref, &count, buf); if (error && error != eofErr) break; source_size -= count; - error = FSWrite(dest_ref, &count, &buf); + error = FSWrite(dest_ref, &count, buf); if (error && error != eofErr) break; } + + free(buf); if (error && error != eofErr) return error; --- zmodem.h Mon Jul 11 22:23:09 2022 +++ zmodem.h Fri Jul 15 23:25:30 2022 @@ -51,7 +51,7 @@ struct zmodem_session { FILE *file; unsigned long file_size; - char file_name[256]; + char file_name[64]; char *upload_file_path; unsigned long file_mtime;