From 4798a8a5560552480efde5fe8b1f7963a25a96d3 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 5 Feb 2018 21:14:32 +0100 Subject: 9pfuse: fix handling of access mode (thanks Kenji Arisawa) Fixes #81. --- src/cmd/9pfuse/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/9pfuse/main.c b/src/cmd/9pfuse/main.c index cbce3ffd..a3662898 100644 --- a/src/cmd/9pfuse/main.c +++ b/src/cmd/9pfuse/main.c @@ -505,7 +505,9 @@ fusesetattr(FuseMsg *m) if(in->valid&FATTR_MTIME) d.mtime = in->mtime; if(in->valid&FATTR_MODE) - d.mode = in->mode; + d.mode = in->mode & 0777; + if((in->mode&S_IFMT) == S_IFDIR) + d.mode |= DMDIR; if((in->valid&FATTR_UID) || (in->valid&FATTR_GID)){ /* * I can't be bothered with these yet. -- cgit v1.2.3 From 112744e54bfdab025bd2146457f41f1f8f4a903b Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Wed, 14 Mar 2018 20:27:46 -0500 Subject: 9pfuse: retries read(3) upon EINTR read(3) sometimes errors with EINTR on macOS over slow connections. 9pfuse(1) now retries read(3) instead of sysfatal(3)ing. --- src/cmd/9pfuse/fuse.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/cmd/9pfuse/fuse.c b/src/cmd/9pfuse/fuse.c index 3f91ce78..b84663e9 100644 --- a/src/cmd/9pfuse/fuse.c +++ b/src/cmd/9pfuse/fuse.c @@ -48,7 +48,6 @@ readfusemsg(void) int n, nn; m = allocfusemsg(); - errno = 0; /* * The FUSE kernel device apparently guarantees * that this read will return exactly one message. @@ -57,7 +56,11 @@ readfusemsg(void) * FUSE returns an ENODEV error, not EOF, * when the connection is unmounted. */ - if((n = read(fusefd, m->buf, fusebufsize)) < 0){ + do{ + errno = 0; + n = read(fusefd, m->buf, fusebufsize); + }while(n < 0 && errno == EINTR); + if(n < 0){ if(errno != ENODEV) sysfatal("readfusemsg: %r"); } -- cgit v1.2.3 From cfa9a6dfa108cda8f830dac649c804161bbde618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20K=C3=BChl?= Date: Wed, 28 Feb 2018 11:10:46 +0100 Subject: 9term: Set TERM_PROGRAM to termprog TERM_PROGRAM is the customary way to identify which kind of terminal emulator program one uses on macOS. This change sets TERM_PROGRAM to termprog since both variables are used for the same purpose. --- src/cmd/9term/rcstart.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/cmd/9term/rcstart.c b/src/cmd/9term/rcstart.c index 5e6e1119..141b9b00 100644 --- a/src/cmd/9term/rcstart.c +++ b/src/cmd/9term/rcstart.c @@ -87,6 +87,7 @@ rcstart(int argc, char **argv, int *pfd, int *tfd) // Set $termprog to 9term or win for those who care about what kind of // dumb terminal this is. putenv("termprog", (char*)termprog); + putenv("TERM_PROGRAM", (char*)termprog); pid = fork(); switch(pid){ -- cgit v1.2.3 From d5791246822e27ef99a593d11518b457ce439a85 Mon Sep 17 00:00:00 2001 From: Ray Lai Date: Fri, 19 Jan 2018 00:39:41 +0800 Subject: 9pserve: fix memory leak in warning --- src/cmd/9pserve.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/cmd/9pserve.c b/src/cmd/9pserve.c index 077715d6..24c80714 100644 --- a/src/cmd/9pserve.c +++ b/src/cmd/9pserve.c @@ -1248,6 +1248,8 @@ mread9p(Ioproc *io, int fd) nn = convM2S(pkt, n, &m->tx); if(nn != n){ fprint(2, "%T read bad packet from %d\n", fd); + free(m->tpkt); + free(m); return nil; } return m; -- cgit v1.2.3 From 4ebaf18e9234bf58aae7a5c47fc15ec4c80812b6 Mon Sep 17 00:00:00 2001 From: Mechiel Lukkien Date: Sat, 6 Jan 2018 18:01:55 +0100 Subject: fontsrv: skip only the surrogate pairs fontsrv wasn't rendering fontawesome icons, which uses the private use area around 0xf000. --- src/cmd/fontsrv/osx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/fontsrv/osx.c b/src/cmd/fontsrv/osx.c index f48f5b49..adb007c2 100644 --- a/src/cmd/fontsrv/osx.c +++ b/src/cmd/fontsrv/osx.c @@ -30,7 +30,7 @@ mapUnicode(char *name, int i) { int j; - if(0xd800 <= i && i < 0xe0000) // surrogate pairs, will crash OS X libraries! + if(0xd800 <= i && i < 0xe000) // surrogate pairs, will crash OS X libraries! return 0xfffd; for(j=0; j Date: Wed, 14 Mar 2018 20:17:10 -0500 Subject: mount, 9pfuse: detect macports installed osxfuse MacPorts installs osxfuse under /opt/local. --- src/cmd/9pfuse/fuse.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/cmd/9pfuse/fuse.c b/src/cmd/9pfuse/fuse.c index b84663e9..66f66065 100644 --- a/src/cmd/9pfuse/fuse.c +++ b/src/cmd/9pfuse/fuse.c @@ -810,6 +810,8 @@ mountfuse(char *mtpt) "/Support/load_osxfusefs"), 0) < 0 && access((v="osxfuse", f="/Library/Filesystems/osxfuse.fs" "/Contents/Resources/load_osxfuse"), 0) < 0 && + access((v="osxfuse", f="/opt/local/Library/Filesystems/osxfuse.fs" + "/Contents/Resources/load_osxfuse"), 0) < 0 && access((v="fusefs", f="/System/Library/Extensions/fusefs.kext" "/Contents/Resources/load_fusefs"), 0) < 0 && access(f="/Library/Extensions/fusefs.kext" @@ -874,6 +876,12 @@ mountfuse(char *mtpt) execl("/Library/Filesystems/osxfuse.fs/Contents/Resources/mount_osxfuse", "mount_osxfuse", buf, mtpt, nil); + /* OSXFUSE >=3.3 from macports */ + putenv("MOUNT_OSXFUSE_DAEMON_PATH", + "/opt/local/Library/Filesystems/osxfuse.fs/Contents/Resources/mount_osxfuse"); + execl("/opt/local/Library/Filesystems/osxfuse.fs/Contents/Resources/mount_osxfuse", + "mount_osxfuse", buf, mtpt, nil); + /* Lion OSXFUSE location */ putenv("MOUNT_FUSEFS_DAEMON_PATH", "/Library/Filesystems/osxfusefs.fs/Support/mount_osxfusefs"); -- cgit v1.2.3 From 96dc2330918909c925a5c3a6407116dad7f93c3a Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Wed, 14 Mar 2018 22:45:33 -0500 Subject: fontsrv: enlarge drawing buffer for subfonts on macOS Double the width returned by CTFontGetBoundingBox when drawing. Add box drawing characters for determining the line height. Call freememimage(1) for the character memimage. Fixes #18. Fixes #120. Fixes #146. --- src/cmd/fontsrv/osx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/fontsrv/osx.c b/src/cmd/fontsrv/osx.c index adb007c2..18197a23 100644 --- a/src/cmd/fontsrv/osx.c +++ b/src/cmd/fontsrv/osx.c @@ -104,6 +104,7 @@ static char *lines[] = { "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz", "g", + "┌┬┐├┼┤└┴┘│─", "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει.", "私はガラスを食べられます。それは私を傷つけません。", "Aš galiu valgyti stiklą ir jis manęs nežeidžia", @@ -234,7 +235,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) bbox = CTFontGetBoundingBox(font); - x = (int)(bbox.size.width + 0.99999999); + x = (int)(bbox.size.width*2 + 0.99999999); fontheight(f, size, &height, &ascent); y = height; @@ -343,6 +344,7 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) m1 = allocmemimage(Rect(0, 0, x, y), antialias ? GREY8 : GREY1); memimagedraw(m1, m1->r, m, m->r.min, memopaque, ZP, S); freememimage(m); + freememimage(mc); sf->name = nil; sf->n = hi+1 - lo; -- cgit v1.2.3 From 7ca1c90109e17dced4b38fbaadea9d2cf39871b7 Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Tue, 20 Mar 2018 22:15:12 -0500 Subject: acme: fix some memory leaks --- src/cmd/acme/acme.c | 7 +++++-- src/cmd/acme/exec.c | 1 + src/cmd/acme/rows.c | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c index 10dcdcc8..742aabdf 100644 --- a/src/cmd/acme/acme.c +++ b/src/cmd/acme/acme.c @@ -383,7 +383,7 @@ int erroutfd; void acmeerrorproc(void *v) { - char *buf; + char *buf, *s; int n; USED(v); @@ -391,8 +391,11 @@ acmeerrorproc(void *v) buf = emalloc(8192+1); while((n=read(errorfd, buf, 8192)) >= 0){ buf[n] = '\0'; - sendp(cerr, estrdup(buf)); + s = estrdup(buf); + sendp(cerr, s); + free(s); } + free(buf); } void diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c index deaef0cb..68c5d976 100644 --- a/src/cmd/acme/exec.c +++ b/src/cmd/acme/exec.c @@ -194,6 +194,7 @@ execute(Text *t, uint aq0, uint aq1, int external, Text *argt) aa = getbytearg(argt, TRUE, TRUE, &a); if(a){ if(strlen(a) > EVENTSIZE){ /* too big; too bad */ + free(r); free(aa); free(a); warning(nil, "argument string too long\n"); diff --git a/src/cmd/acme/rows.c b/src/cmd/acme/rows.c index 2d6cbcca..8cff0855 100644 --- a/src/cmd/acme/rows.c +++ b/src/cmd/acme/rows.c @@ -613,6 +613,7 @@ rowload(Row *row, char *file, int initing) } textdelete(&row->col[i]->tag, 0, row->col[i]->tag.file->b.nc, TRUE); textinsert(&row->col[i]->tag, 0, r+n+1, nr-(n+1), TRUE); + free(r); break; case 'w': l[Blinelen(b)-1] = 0; @@ -626,6 +627,7 @@ rowload(Row *row, char *file, int initing) } textdelete(&row->tag, 0, row->tag.file->b.nc, TRUE); textinsert(&row->tag, 0, r, nr, TRUE); + free(r); break; default: done = 1; -- cgit v1.2.3 From b2f67698309b0c573cd52e357be126171be0a93a Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Tue, 20 Mar 2018 22:16:17 -0500 Subject: devdraw: fix some memory leaks in x11 --- src/cmd/devdraw/x11-init.c | 2 ++ src/cmd/devdraw/x11-itrans.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/devdraw/x11-init.c b/src/cmd/devdraw/x11-init.c index 04b13a03..5363fb74 100644 --- a/src/cmd/devdraw/x11-init.c +++ b/src/cmd/devdraw/x11-init.c @@ -176,6 +176,7 @@ _xattach(char *label, char *winsize) } } } + XFree(pfmt); if(_x.chan == 0){ werrstr("could not determine screen pixel format"); goto err0; @@ -232,6 +233,7 @@ _xattach(char *label, char *winsize) geom = smprint("%s.geometry", label); if(geom && XrmGetResource(database, geom, nil, &geomrestype, &geomres)) mask = XParseGeometry(geomres.addr, &x, &y, (uint*)&width, (uint*)&height); + XrmDestroyDatabase(database); free(geom); if((mask & WidthValue) && (mask & HeightValue)){ diff --git a/src/cmd/devdraw/x11-itrans.c b/src/cmd/devdraw/x11-itrans.c index d84cdc8f..729f2647 100644 --- a/src/cmd/devdraw/x11-itrans.c +++ b/src/cmd/devdraw/x11-itrans.c @@ -431,8 +431,10 @@ _xgetsnarffrom(XWindow w, Atom clipboard, Atom target, int timeout0, int timeout usleep(10*1000); XGetWindowProperty(_x.display, _x.drawable, prop, 0, 0, 0, AnyPropertyType, &type, &fmt, &dummy, &len, &xdata); - if(lastlen == len && len > 0) + if(lastlen == len && len > 0){ + XFree(xdata); break; + } lastlen = len; XFree(xdata); } -- cgit v1.2.3 From a3ec102dc7fee3d4ecb32ade5ec9d7de4b9b4304 Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Tue, 20 Mar 2018 22:17:05 -0500 Subject: fontsrv: fix some memory leaks --- src/cmd/fontsrv/osx.c | 4 +++- src/cmd/fontsrv/x11.c | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/fontsrv/osx.c b/src/cmd/fontsrv/osx.c index 18197a23..4d969290 100644 --- a/src/cmd/fontsrv/osx.c +++ b/src/cmd/fontsrv/osx.c @@ -245,8 +245,10 @@ mksubfont(XFont *f, char *name, int lo, int hi, int size, int antialias) if(m == nil) return nil; mc = allocmemimage(Rect(0, 0, x+1, y+1), GREY8); - if(mc == nil) + if(mc == nil){ + freememimage(m); return nil; + } memfillcolor(m, DBlack); memfillcolor(mc, DBlack); fc = malloc((hi+2 - lo) * sizeof fc[0]); diff --git a/src/cmd/fontsrv/x11.c b/src/cmd/fontsrv/x11.c index f106d253..a097ca4d 100644 --- a/src/cmd/fontsrv/x11.c +++ b/src/cmd/fontsrv/x11.c @@ -236,6 +236,7 @@ mksubfont(XFont *xf, char *name, int lo, int hi, int size, int antialias) m1 = allocmemimage(Rect(0, 0, x, y), antialias ? GREY8 : GREY1); memimagedraw(m1, m1->r, m, m->r.min, memopaque, ZP, S); freememimage(m); + freememimage(mc); sf->name = nil; sf->n = hi+1 - lo; -- cgit v1.2.3 From dc2a17b95cace1f220292cb6df97ee423d6be229 Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Tue, 20 Mar 2018 22:17:57 -0500 Subject: libdraw: fix some memory leaks in font handling --- src/libdraw/buildfont.c | 1 + src/libdraw/freesubfont.c | 1 + src/libdraw/openfont.c | 20 ++++++++++++++------ src/libdraw/subfontcache.c | 1 + src/libdraw/subfontname.c | 1 + 5 files changed, 18 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/libdraw/buildfont.c b/src/libdraw/buildfont.c index d3f2e69e..ed533b14 100644 --- a/src/libdraw/buildfont.c +++ b/src/libdraw/buildfont.c @@ -36,6 +36,7 @@ buildfont(Display *d, char *buf, char *name) if(fnt->name==0 || fnt->cache==0 || fnt->subf==0){ Err2: free(fnt->name); + free(fnt->namespec); free(fnt->cache); free(fnt->subf); free(fnt->sub); diff --git a/src/libdraw/freesubfont.c b/src/libdraw/freesubfont.c index 6830b9dc..16b2ef3e 100644 --- a/src/libdraw/freesubfont.c +++ b/src/libdraw/freesubfont.c @@ -12,6 +12,7 @@ freesubfont(Subfont *f) return; uninstallsubfont(f); free(f->info); /* note: f->info must have been malloc'ed! */ + free(f->name); freeimage(f->bits); free(f); } diff --git a/src/libdraw/openfont.c b/src/libdraw/openfont.c index b97ea22d..2b729d73 100644 --- a/src/libdraw/openfont.c +++ b/src/libdraw/openfont.c @@ -31,7 +31,7 @@ openfont1(Display *d, char *name) { Font *fnt; int fd, i, n, scale; - char *buf, *nambuf, *fname, *freename; + char *buf, *nambuf, *nambuf0, *fname, *freename; nambuf = 0; freename = nil; @@ -42,19 +42,21 @@ openfont1(Display *d, char *name) nambuf = smprint("#9/font/%s", fname+14); if(nambuf == nil) return 0; - nambuf = unsharp(nambuf); + *nambuf0 = unsharp(nambuf); + if(nambuf0 != nambuf) + free(nambuf); + nambuf = nambuf0; if(nambuf == nil) return 0; if((fd = open(nambuf, OREAD)) < 0){ free(nambuf); return 0; } - fname = nambuf; if(scale > 1) { - name = smprint("%d*%s", scale, fname); + name = smprint("%d*%s", scale, nambuf); freename = name; } else { - name = fname; + name = nambuf; } } if(fd >= 0) @@ -63,13 +65,17 @@ openfont1(Display *d, char *name) fd = _fontpipe(fname+10); n = 128*1024; } - if(fd < 0) + if(fd < 0){ + free(nambuf); + free(freename); return 0; + } buf = malloc(n+1); if(buf == 0){ close(fd); free(nambuf); + free(freename); return 0; } i = readn(fd, buf, n); @@ -77,6 +83,7 @@ openfont1(Display *d, char *name) if(i <= 0){ free(buf); free(nambuf); + free(freename); return 0; } buf[i] = 0; @@ -224,6 +231,7 @@ openfont(Display *d, char *name) if(!f) return nil; f->lodpi = f; + free(f->namespec); f->namespec = namespec; /* add to display list for when dpi changes */ diff --git a/src/libdraw/subfontcache.c b/src/libdraw/subfontcache.c index 2a7f489b..91a6861a 100644 --- a/src/libdraw/subfontcache.c +++ b/src/libdraw/subfontcache.c @@ -34,6 +34,7 @@ void uninstallsubfont(Subfont *subfont) { if(subfont == lastsubfont){ + free(lastname); lastname = 0; lastsubfont = 0; } diff --git a/src/libdraw/subfontname.c b/src/libdraw/subfontname.c index 9280244a..9d68570d 100644 --- a/src/libdraw/subfontname.c +++ b/src/libdraw/subfontname.c @@ -47,6 +47,7 @@ subfontname(char *cfname, char *fname, int maxdepth) } return tmp2; } + free(tmp2); } /* try default */ -- cgit v1.2.3 From edfe3c016fe6ef10c55f7a17aab668214ec21efc Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Wed, 21 Mar 2018 22:24:12 -0500 Subject: sam: freetmpstr instead of free --- src/cmd/sam/error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/sam/error.c b/src/cmd/sam/error.c index eb4e48f4..70554e19 100644 --- a/src/cmd/sam/error.c +++ b/src/cmd/sam/error.c @@ -138,7 +138,7 @@ termwrite(char *s) else Strinsert(&cmdstr, p, cmdstr.n); cmdptadv += p->n; - free(p); + freetmpstr(p); }else Write(2, s, strlen(s)); } -- cgit v1.2.3 From 75ea8515a5cd26817b4eb5de99eeb6934def9328 Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Wed, 21 Mar 2018 22:24:50 -0500 Subject: samterm: free some getenv results --- src/cmd/samterm/plan9.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/cmd/samterm/plan9.c b/src/cmd/samterm/plan9.c index 469d566e..1b933578 100644 --- a/src/cmd/samterm/plan9.c +++ b/src/cmd/samterm/plan9.c @@ -53,8 +53,10 @@ getscreen(int argc, char **argv) threadexitsall("init"); } t = getenv("tabstop"); - if(t != nil) + if(t != nil){ maxtab = strtoul(t, nil, 0); + free(t); + } draw(screen, screen->clipr, display->white, nil, ZP); } @@ -149,10 +151,13 @@ extstart(void) if(user == nil) return; disp = getenv("DISPLAY"); - if(disp) + if(disp){ exname = smprint("/tmp/.sam.%s.%s", user, disp); + free(disp); + } else exname = smprint("/tmp/.sam.%s", user); + free(user); if(exname == nil){ fprint(2, "not posting for B: out of memory\n"); return; -- cgit v1.2.3 From 96025b1ec8916c986fb691db79ae96d4f690c8f1 Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Thu, 22 Mar 2018 23:16:53 -0500 Subject: mc: fix crash in acme with hidpi display --- src/cmd/draw/mc.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/cmd/draw/mc.c b/src/cmd/draw/mc.c index c24d67b3..ea36e28d 100644 --- a/src/cmd/draw/mc.c +++ b/src/cmd/draw/mc.c @@ -268,8 +268,8 @@ void getwidth(void) { CFsys *fs; - char buf[500], *p, *q, *f[10]; - int fd, n, nf; + char buf[500], *p, *q, *f[10], *fname; + int fd, n, nf, scale; struct winsize ws; Font *f1; @@ -285,15 +285,19 @@ getwidth(void) buf[n] = 0; if((nf=tokenize(buf, f, nelem(f))) < 7) return; + // hidpi font in stringwidth(3) will call scalesubfont, + // which aborts in bytesperline, due to unknow depth, + // without initdraw. We scale by ourselves. + scale = parsefontscale(f[6], &fname); tabwid = 0; - if(nf >= 8 && (tabwid = atoi(f[7])) == 0) + if(nf >= 8 && (tabwid = atoi(f[7])/scale) == 0) return; - if((font = openfont(nil, f[6])) == nil) + if((font = openfont(nil, fname)) == nil) return; mintab = stringwidth(font, "0"); if(tabwid == 0) tabwid = mintab*4; - linewidth = atoi(f[5]); + linewidth = atoi(f[5]) / scale; tabflag = 1; return; } -- cgit v1.2.3 From 03a8ec739af17bc4ba0a2e18ea59b33671c34f2b Mon Sep 17 00:00:00 2001 From: Xiao-Yong Jin Date: Tue, 27 Mar 2018 10:52:45 -0500 Subject: libdraw: fix error in the previous commit --- src/libdraw/openfont.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/libdraw/openfont.c b/src/libdraw/openfont.c index 2b729d73..3fe9410a 100644 --- a/src/libdraw/openfont.c +++ b/src/libdraw/openfont.c @@ -42,7 +42,7 @@ openfont1(Display *d, char *name) nambuf = smprint("#9/font/%s", fname+14); if(nambuf == nil) return 0; - *nambuf0 = unsharp(nambuf); + nambuf0 = unsharp(nambuf); if(nambuf0 != nambuf) free(nambuf); nambuf = nambuf0; -- cgit v1.2.3