FreeBSD Bugzilla – Attachment 156876 Details for
Bug 199476
[patch] panic when geom_uncompress tastes large filesystems
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Proposed patch
uncompress.diff (text/plain), 2.51 KB, created by
Andrey V. Elsukov
on 2015-05-18 14:47:29 UTC
(
hide
)
Description:
Proposed patch
Filename:
MIME Type:
Creator:
Andrey V. Elsukov
Created:
2015-05-18 14:47:29 UTC
Size:
2.51 KB
patch
obsolete
>Index: head/sys/geom/uncompress/g_uncompress.c >=================================================================== >--- head/sys/geom/uncompress/g_uncompress.c (revision 283051) >+++ head/sys/geom/uncompress/g_uncompress.c (working copy) >@@ -464,7 +464,8 @@ g_uncompress_taste(struct g_class *mp, struct g_pr > struct g_provider *pp2; > struct g_consumer *cp; > struct g_geom *gp; >- uint32_t i, total_offsets, type; >+ uint64_t *offsets; >+ uint32_t i, r, total, total_offsets, type; > uint8_t *buf; > int error; > >@@ -499,8 +500,8 @@ g_uncompress_taste(struct g_class *mp, struct g_pr > */ > DPRINTF(("%s: media sectorsize %u, mediasize %jd\n", > gp->name, pp->sectorsize, (intmax_t)pp->mediasize)); >- i = roundup(sizeof(struct cloop_header), pp->sectorsize); >- buf = g_read_data(cp, 0, i, NULL); >+ total = roundup(sizeof(struct cloop_header), pp->sectorsize); >+ buf = g_read_data(cp, 0, total, NULL); > if (buf == NULL) > goto err; > header = (struct cloop_header *) buf; >@@ -557,20 +558,29 @@ g_uncompress_taste(struct g_class *mp, struct g_pr > gp->name, sc->nblocks); > goto err; > } >- free(buf, M_GEOM); >+ g_free(buf); > >- i = roundup((sizeof(struct cloop_header) + >+ sc->offsets = malloc(total_offsets * sizeof(uint64_t), >+ M_GEOM_UNCOMPRESS, M_WAITOK | M_ZERO); >+ total = roundup((sizeof(struct cloop_header) + > total_offsets * sizeof(uint64_t)), pp->sectorsize); >- buf = g_read_data(cp, 0, i, NULL); >- if (buf == NULL) >- goto err; >- sc->offsets = malloc(total_offsets * sizeof(uint64_t), >- M_GEOM_UNCOMPRESS, M_WAITOK); >- for (i = 0; i <= total_offsets; i++) { >- sc->offsets[i] = be64toh(((uint64_t *) >- (buf+sizeof(struct cloop_header)))[i]); >+#define RSZ ((total - r) > MAXPHYS ? MAXPHYS: (total - r)) >+ for (r = 0, i = 0; r < total; r += MAXPHYS) { >+ buf = g_read_data(cp, r, RSZ, &error); >+ if (buf == NULL) { >+ free(sc->offsets, M_GEOM_UNCOMPRESS); >+ goto err; >+ } >+ offsets = (uint64_t *)buf; >+ if (r == 0) >+ offsets += >+ sizeof(struct cloop_header) / sizeof(uint64_t); >+ for (; i < total_offsets && offsets < (uint64_t *)(buf + RSZ); >+ i++, offsets++) >+ sc->offsets[i] = be64toh(*offsets); >+ g_free(buf); > } >- free(buf, M_GEOM); >+#undef RSZ > buf = NULL; > DPRINTF(("%s: done reading offsets\n", gp->name)); > mtx_init(&sc->last_mtx, "geom_uncompress cache", NULL, MTX_DEF); >@@ -619,7 +629,7 @@ err: > g_topology_lock(); > g_access(cp, -1, 0, 0); > if (buf != NULL) >- free(buf, M_GEOM); >+ g_free(buf); > if (gp->softc != NULL) { > g_uncompress_softc_free(gp->softc, NULL); > gp->softc = NULL;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 199476
:
155638
|
156873
| 156876