wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit e083924cdfcb58d91b410ff93587ab8eba901a8a
parent 4bfca250ce0fa2d00faa79430158eb30a94c8dbf
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue,  7 Mar 2006 17:53:16 +0100

made mkqid more robust against special paths like /clients/cache/clients/keys


Diffstat:
cmd/wm/fs.c | 24+++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -355,6 +355,8 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) case FsDcache: case FsDclients: case FsDbar: + if(dir_type != FsDroot) + return -1; new->type = IXP_QTDIR; new->path = mkqpath(type, 0, 0, 0); break; @@ -362,7 +364,7 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) new->type = IXP_QTDIR; if(!strncmp(wname, "ws", 3) && dir_type == FsDroot) new->path = mkqpath(FsDws, ntag ? tag[sel]->id : 0, 0, 0); - else { + else if(dir_type == FsDcache) { for(i = 0; i < ntag; i++) if(!strncmp(wname, tag[i]->name, strlen(tag[i]->name))) break; @@ -370,8 +372,12 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) return -1; new->path = mkqpath(FsDws, tag[i]->id, 0, 0); } + else + return -1; break; case FsDlabel: + if(dir_type != FsDbar) + return -1; new->type = IXP_QTDIR; if(!strncmp(wname, "new", 4)) { if(iswalk) @@ -387,7 +393,7 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) } break; case FsDarea: - if(dir_i1 == -1) + if(dir_i1 == -1 || dir_type != FsDws) return -1; { Tag *p = tag[dir_i1]; @@ -404,7 +410,7 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) } break; case FsDclient: - if(dir_i1 == -1 || dir_i2 == -1) + if(dir_i1 == -1 || dir_i2 == -1 || dir_type != FsDarea) return -1; { Tag *p = tag[dir_i1]; @@ -424,12 +430,16 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) } break; case FsDGclient: + if(dir_type != FsDclients) + return -1; i = cext_strtonum(wname, 0, 0xffff, &err); if(err || (i >= nclient)) return -1; new->path = mkqpath(FsDGclient, client[i]->id, 0, 0); break; case FsFkey: + if(dir_type != FsDkeys) + return -1; { Key *k; if(!(k = name2key(wname))) @@ -440,13 +450,13 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) break; case FsFdata: case FsFcolors: - if((dir_type == FsDlabel) && (dir_i1 == -1)) + if((dir_i1 == -1) || (dir_type != FsDlabel)) return -1; new->type = IXP_QTFILE; new->path = mkqpath(type, qpath_i1id(dir->path), qpath_i2id(dir->path), qpath_i3id(dir->path)); break; case FsFmode: - if(dir_i1 == -1 || dir_i2 == -1) + if(dir_i1 == -1 || dir_i2 == -1 || dir_type != FsDarea) return -1; new->type = IXP_QTFILE; new->path = mkqpath(type, qpath_i1id(dir->path), qpath_i2id(dir->path), qpath_i3id(dir->path)); @@ -454,9 +464,9 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) case FsFgeom: case FsFname: case FsFtags: - if((dir_type == FsDclient) && (dir_i1 == -1 || dir_i2 == -1 || dir_i3 == -1)) + if((dir_i1 == -1 || dir_i2 == -1 || dir_i3 == -1) || dir_type != FsDclient) return -1; - else if(dir_i1 == -1) + else if(dir_i1 == -1 || dir_type != FsDGclient) return -1; new->type = IXP_QTFILE; new->path = mkqpath(type, qpath_i1id(dir->path), qpath_i2id(dir->path), qpath_i3id(dir->path));