add_sound_mapping cleanup

- avoid several buffer overflows
- move use of access() to files.c in new can_read_file() function
- remove extra newlines in raw_print() calls
- get ready for lint, eg sprintf -> Sprintf
- generally make the code look like core code, not Qt code
This commit is contained in:
cohrs
2002-02-21 03:33:42 +00:00
parent 403cee9b5b
commit ae9f38222e
3 changed files with 58 additions and 43 deletions
+6 -1
View File
@@ -630,6 +630,9 @@ E void FDECL(compress, (const char *));
E void FDECL(uncompress, (const char *)); E void FDECL(uncompress, (const char *));
E boolean FDECL(lock_file, (const char *,int,int)); E boolean FDECL(lock_file, (const char *,int,int));
E void FDECL(unlock_file, (const char *)); E void FDECL(unlock_file, (const char *));
#ifdef USER_SOUNDS
E boolean FDECL(can_read_file, (const char *));
#endif
E void FDECL(read_config_file, (const char *)); E void FDECL(read_config_file, (const char *));
E void FDECL(check_recordfile, (const char *)); E void FDECL(check_recordfile, (const char *));
#if defined(WIZARD) #if defined(WIZARD)
@@ -1793,7 +1796,9 @@ E void FDECL(yelp, (struct monst *));
E void FDECL(whimper, (struct monst *)); E void FDECL(whimper, (struct monst *));
E void FDECL(beg, (struct monst *)); E void FDECL(beg, (struct monst *));
E int NDECL(dotalk); E int NDECL(dotalk);
#ifdef USER_SOUNDS
E int FDECL(add_sound_mapping, (const char *));
#endif
/* ### sys/msdos/sound.c ### */ /* ### sys/msdos/sound.c ### */
+9 -1
View File
@@ -103,7 +103,6 @@ static int lockptr;
#endif #endif
#ifdef USER_SOUNDS #ifdef USER_SOUNDS
extern int FDECL(add_sound_mapping, (const char* mapping));
extern char *sounddir; extern char *sounddir;
#endif #endif
@@ -1523,6 +1522,15 @@ char *tmp_levels;
return 1; return 1;
} }
#ifdef USER_SOUNDS
boolean
can_read_file(filename)
const char *filename;
{
return (access(filename, 4) == 0);
}
#endif /* USER_SOUNDS */
void void
read_config_file(filename) read_config_file(filename)
const char *filename; const char *filename;
+43 -41
View File
@@ -918,63 +918,65 @@ extern void FDECL(play_usersound, (const char*, int));
typedef struct audio_mapping_rec { typedef struct audio_mapping_rec {
struct re_pattern_buffer regex; struct re_pattern_buffer regex;
char* filename; char *filename;
int volume; int volume;
struct audio_mapping_rec* next; struct audio_mapping_rec *next;
} audio_mapping; } audio_mapping;
static audio_mapping* soundmap=0; static audio_mapping *soundmap = 0;
char* sounddir="."; char* sounddir = ".";
/* adds a sound file mapping, returns 0 on failure, 1 on success */
int int
add_sound_mapping(mapping) add_sound_mapping(mapping)
const char* mapping; const char *mapping;
{ {
char text[256]; char text[256];
char filename[256]; char filename[256];
char filespec[256]; char filespec[256];
int volume; int volume;
if (sscanf(mapping, "MESG \"%[^\"]\"%*[\t ]\"%[^\"]\" %d", if (sscanf(mapping, "MESG \"%255[^\"]\"%*[\t ]\"%255[^\"]\" %d",
text, filename, &volume)==3) text, filename, &volume) == 3) {
{ const char *err;
const char* err; audio_mapping *new_map;
audio_mapping* new_map;
sprintf(filespec,"%s/%s",sounddir,filename); if (strlen(sounddir) + strlen(filename) > 254) {
raw_print("sound file name too long");
return 0;
}
Sprintf(filespec, "%s/%s", sounddir, filename);
if (access(filespec, R_OK)==0) { if (can_read_file(filespec)) {
new_map=(audio_mapping*)alloc(sizeof(audio_mapping)); new_map = (audio_mapping *)alloc(sizeof(audio_mapping));
new_map->regex.translate=0; new_map->regex.translate = 0;
new_map->regex.fastmap=0; new_map->regex.fastmap = 0;
new_map->regex.buffer=0; new_map->regex.buffer = 0;
new_map->regex.allocated=0; new_map->regex.allocated = 0;
new_map->regex.regs_allocated=REGS_FIXED; new_map->regex.regs_allocated = REGS_FIXED;
new_map->filename=strdup(filespec); new_map->filename = strdup(filespec);
new_map->volume=volume; new_map->volume = volume;
new_map->next=soundmap; new_map->next = soundmap;
err=re_compile_pattern(text, strlen(text), &new_map->regex); err = re_compile_pattern(text, strlen(text), &new_map->regex);
if (err) { if (err) {
sprintf(text, "%s\n", err); raw_print(err);
raw_print(text); free(new_map->filename);
free(new_map->filename); free(new_map);
free(new_map); return 0;
return 0;
} else {
soundmap=new_map;
}
} else { } else {
sprintf(text, "%s not readable.\n", filespec); soundmap = new_map;
raw_print(text);
return 0;
} }
} else { } else {
sprintf(text, "syntax error in SOUND\n"); Sprintf(text, "cannot read %.243s", filespec);
raw_print(text); raw_print(text);
return 0; return 0;
}
} else {
raw_print("syntax error in SOUND");
return 0;
} }
return 1; return 1;
@@ -984,13 +986,13 @@ void
play_sound_for_message(msg) play_sound_for_message(msg)
const char* msg; const char* msg;
{ {
audio_mapping* cursor=soundmap; audio_mapping* cursor = soundmap;
while (cursor) { while (cursor) {
if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0)>=0) { if (re_search(&cursor->regex, msg, strlen(msg), 0, 9999, 0) >= 0) {
play_usersound(cursor->filename, cursor->volume); play_usersound(cursor->filename, cursor->volume);
} }
cursor=cursor->next; cursor = cursor->next;
} }
} }