Module Name: src
Committed By: palle
Date: Fri Mar 3 21:09:25 UTC 2017
Modified Files:
src/sys/arch/sparc64/dev: ldc.c vdsk.c
Log Message:
sun4v: Fixed PR 51554 - Avoid unsafe allocation in ldc/vdsk
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/sparc64/dev/ldc.c \
src/sys/arch/sparc64/dev/vdsk.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sparc64/dev/ldc.c
diff -u src/sys/arch/sparc64/dev/ldc.c:1.2 src/sys/arch/sparc64/dev/ldc.c:1.3
--- src/sys/arch/sparc64/dev/ldc.c:1.2 Sat Aug 20 18:21:18 2016
+++ src/sys/arch/sparc64/dev/ldc.c Fri Mar 3 21:09:25 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: ldc.c,v 1.2 2016/08/20 18:21:18 nakayama Exp $ */
+/* $NetBSD: ldc.c,v 1.3 2017/03/03 21:09:25 palle Exp $ */
/* $OpenBSD: ldc.c,v 1.12 2015/03/21 18:02:58 kettenis Exp $ */
/*
* Copyright (c) 2009 Mark Kettenis
@@ -554,6 +554,8 @@ ldc_queue_alloc(int nentries)
goto unmap;
#else
va = (vaddr_t)kmem_zalloc(size, KM_NOSLEEP);
+ if (va == 0)
+ goto free;
#endif
lq->lq_va = (vaddr_t)va;
lq->lq_nentries = nentries;
@@ -565,6 +567,9 @@ free:
bus_dmamem_free(t, &lq->lq_seg, 1);
destroy:
bus_dmamap_destroy(t, lq->lq_map);
+#else
+free:
+ kmem_free(lq, sizeof(struct ldc_queue));
#endif
return (NULL);
}
@@ -637,6 +642,8 @@ ldc_map_alloc(int nentries)
}
#else
va = (vaddr_t)kmem_zalloc(size, KM_NOSLEEP);
+ if (va == 0)
+ goto free;
#endif
lm->lm_slot = (struct ldc_map_slot *)va;
lm->lm_nentries = nentries;
@@ -650,6 +657,9 @@ free:
bus_dmamem_free(t, &lm->lm_seg, 1);
destroy:
bus_dmamap_destroy(t, lm->lm_map);
+#else
+free:
+ kmem_free(lm, sizeof(struct ldc_map));
#endif
return (NULL);
}
Index: src/sys/arch/sparc64/dev/vdsk.c
diff -u src/sys/arch/sparc64/dev/vdsk.c:1.2 src/sys/arch/sparc64/dev/vdsk.c:1.3
--- src/sys/arch/sparc64/dev/vdsk.c:1.2 Sat Aug 20 18:21:18 2016
+++ src/sys/arch/sparc64/dev/vdsk.c Fri Mar 3 21:09:25 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: vdsk.c,v 1.2 2016/08/20 18:21:18 nakayama Exp $ */
+/* $NetBSD: vdsk.c,v 1.3 2017/03/03 21:09:25 palle Exp $ */
/* $OpenBSD: vdsk.c,v 1.46 2015/01/25 21:42:13 kettenis Exp $ */
/*
* Copyright (c) 2009, 2011 Mark Kettenis
@@ -969,6 +969,8 @@ vdsk_dring_alloc(int nentries)
goto unmap;
#else
va = (vaddr_t)kmem_zalloc(size, KM_NOSLEEP);
+ if (va == 0)
+ goto free;
#endif
vd->vd_desc = (struct vd_desc *)va;
vd->vd_nentries = nentries;
@@ -984,6 +986,9 @@ free:
bus_dmamem_free(t, &vd->vd_seg, 1);
destroy:
bus_dmamap_destroy(t, vd->vd_map);
+#else
+free:
+ kmem_free(vd, sizeof(struct vdsk_dring));
#endif
return (NULL);
}