00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <sys/types.h>
00035 #include <sys/stat.h>
00036 #include <stdio.h>
00037 #include <stdlib.h>
00038 #include <string.h>
00039 #include <unistd.h>
00040 #include <errno.h>
00041 #include <err.h>
00042
00043 #include "config.h"
00044 #include "test.h"
00045
00046 static
00047 int
00048 try_sbrk(long val)
00049 {
00050 void *rv;
00051 rv = sbrk(val);
00052 if (rv==(void *)-1) {
00053 return errno;
00054 }
00055 return 0;
00056 }
00057
00058 static
00059 void
00060 enforce_sbrk(long val, const char *desc, int err)
00061 {
00062 int e;
00063
00064 e = try_sbrk(val);
00065 if (e != err && e==0) {
00066 warnx("FAILURE: sbrk(%s): no error", desc);
00067 return;
00068 }
00069 if (e != err) {
00070 errno = e;
00071 warn("FAILURE: sbrk(%s): wrong error", desc);
00072 return;
00073 }
00074 warnx("passed: sbrk(%s)", desc);
00075 }
00076
00077 static
00078 void
00079 sbrk_bigpos(void)
00080 {
00081 enforce_sbrk(4096*1024*256, "huge positive", ENOMEM);
00082 }
00083
00084 static
00085 void
00086 sbrk_bigneg(void)
00087 {
00088 enforce_sbrk(-4096*1024*256, "huge negative", EINVAL);
00089 }
00090
00091 static
00092 void
00093 sbrk_neg(void)
00094 {
00095 enforce_sbrk(-8192, "too-large negative", EINVAL);
00096 }
00097
00098 static
00099 void
00100 sbrk_unalignedpos(void)
00101 {
00102 switch (try_sbrk(17)) {
00103 case 0:
00104 case EINVAL:
00105 warnx("passed: sbrk(unaligned positive)");
00106 break;
00107 default:
00108 warn("FAILURE: sbrk(unaligned positive): wrong error");
00109 break;
00110 }
00111 }
00112
00113 static
00114 void
00115 sbrk_unalignedneg(void)
00116 {
00117 switch (try_sbrk(-17)) {
00118 case 0:
00119 case EINVAL:
00120 warnx("passed: sbrk(unaligned negative)");
00121 break;
00122 default:
00123 warn("FAILURE: sbrk(unaligned negative): wrong error");
00124 break;
00125 }
00126 }
00127
00128 void
00129 test_sbrk(void)
00130 {
00131 sbrk_neg();
00132 sbrk_bigpos();
00133 sbrk_bigneg();
00134 sbrk_unalignedpos();
00135 sbrk_unalignedneg();
00136 }
00137