- Timestamp:
- Jul 18, 2015, 5:06:52 PM (9 years ago)
- Location:
- trunk/src
- Files:
-
- 9 added
- 7 deleted
- 62 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/cutest_sh_tiger0.c
r444 r481 28 28 if (skey != NULL) 29 29 { 30 skey->mlock_failed = S L_FALSE;30 skey->mlock_failed = S_FALSE; 31 31 skey->rngI = BAD; 32 32 /* properly initialized later -
trunk/src/cutest_sh_unix.c
r474 r481 14 14 int j, i; 15 15 int sum; 16 #ifndef USE_SYSTEM_MALLOC 16 17 int i_malloc = malloc_count; 18 #endif 17 19 18 20 char * buf; … … 35 37 CuAssertStrEquals(tc, "testing realloctesting realloc", buf); 36 38 39 #ifndef USE_SYSTEM_MALLOC 37 40 i_malloc = malloc_count; 41 #endif 38 42 39 43 for (j = 0; j < 64; ++j) … … 60 64 CuAssertStrEquals(tc, "testing realloctesting realloc", buf); 61 65 66 #ifndef USE_SYSTEM_MALLOC 62 67 i_malloc = malloc_count; 68 #endif 63 69 64 70 for (j = 0; j < 64; ++j) … … 97 103 } 98 104 105 #ifndef USE_SYSTEM_MALLOC 99 106 i_malloc = malloc_count; 107 #endif 100 108 101 109 for (j = 0; j < nalloc; ++j) … … 122 130 for (j = 0; j < 32; ++j) 123 131 { 132 #ifndef USE_SYSTEM_MALLOC 124 133 i_malloc = malloc_count; 134 #endif 125 135 buf = malloc((j+1) * 1024 * 1024); 126 136 CuAssertPtrNotNull(tc, buf); -
trunk/src/cutest_sh_utils.c
r444 r481 531 531 } 532 532 533 -
trunk/src/cutest_zAVLTree.c
r452 r481 21 21 static zAVLKey ztest_intkey(void const *item) 22 22 { 23 return (&(( struct ztest *)item)->iname);23 return (&((const struct ztest *)item)->iname); 24 24 } 25 25 -
trunk/src/dnmalloc.c
r383 r481 220 220 #ifdef linux 221 221 #define HAVE_MREMAP 1 222 #define _GNU_SOURCE 222 #define _GNU_SOURCE 1 223 223 #else 224 224 #define HAVE_MREMAP 0 … … 310 310 char * i3 = "): "; 311 311 char * i5 = "\n"; 312 int res = 0; 313 314 iov[0].iov_base = i1; iov[0].iov_len = strlen(i1); 315 iov[1].iov_base = (char*) file; iov[1].iov_len = strlen(file); 316 iov[2].iov_base = i3; iov[2].iov_len = strlen(i3); 317 iov[3].iov_base = (char*) error; iov[3].iov_len = strlen(error); 318 iov[4].iov_base = i5; iov[4].iov_len = strlen(i5); 312 int res = 0; 313 char ifile[128]; 314 char ierr[128]; 315 316 strncpy(ifile, file, sizeof(ifile)); ifile[sizeof(ifile)-1] = '\0'; 317 strncpy(ierr, error, sizeof(ierr)); ierr[sizeof(ierr)-1] = '\0'; 318 319 iov[0].iov_base = i1; iov[0].iov_len = strlen(i1); 320 iov[1].iov_base = ifile; iov[1].iov_len = strlen(ifile); 321 iov[2].iov_base = i3; iov[2].iov_len = strlen(i3); 322 iov[3].iov_base = ierr; iov[3].iov_len = strlen(ierr); 323 iov[4].iov_base = i5; iov[4].iov_len = strlen(i5); 319 324 do { 320 325 res = writev(STDERR_FILENO, iov, 5); … … 343 348 344 349 static assert_handler_tp *assert_handler = NULL; 350 #ifndef NDEBUG 345 351 #define NDEBUG 352 #endif 346 353 #define assert(x) ((void)0) 347 354 … … 3764 3771 } /* not extended previous region */ 3765 3772 3766 /* Update statistics */ /* FIXME check this */3773 /* Update statistics */ 3767 3774 sum = av->sbrked_mem; 3768 3775 if (sum > (CHUNK_SIZE_T)(av->max_sbrked_mem)) -
trunk/src/rijndael-alg-fst.c
r440 r481 1 /* $NetBSD: rijndael-alg-fst.c,v 1.7 2005/12/11 12:20:52 christos Exp $ */ 2 /* $KAME: rijndael-alg-fst.c,v 1.10 2003/07/15 10:47:16 itojun Exp $ */ 3 /** 4 * rijndael-alg-fst.c 5 * 6 * @version 3.0 (December 2000) 7 * 8 * Optimised ANSI C code for the Rijndael cipher (now AES) 9 * 10 * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> 11 * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> 12 * @author Paulo Barreto <paulo.barreto@terra.com.br> 13 * 14 * This code is hereby placed in the public domain. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS 17 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "config_xor.h" 30 31 #include <sys/types.h> 32 #include <string.h> 33 34 #ifdef SH_ENCRYPT 35 36 typedef unsigned char u8; 37 #if defined(HAVE_INT_32) 38 typedef unsigned int u32; 39 #elif defined(HAVE_LONG_32) 40 typedef unsigned long u32; 41 #elif defined(HAVE_SHORT_32) 42 typedef unsigned short u32; 43 #else 44 #error "No 32 bit integer type found" 45 #endif 46 47 #include "rijndael-alg-fst.h" 48 49 #define FULL_UNROLL 1 1 50 /* 2 * rijndael-alg-fst.c v2.3 April '2000 51 Te0[x] = S [x].[02, 01, 01, 03]; 52 Te1[x] = S [x].[03, 02, 01, 01]; 53 Te2[x] = S [x].[01, 03, 02, 01]; 54 Te3[x] = S [x].[01, 01, 03, 02]; 55 Te4[x] = S [x].[01, 01, 01, 01]; 56 57 Td0[x] = Si[x].[0e, 09, 0d, 0b]; 58 Td1[x] = Si[x].[0b, 0e, 09, 0d]; 59 Td2[x] = Si[x].[0d, 0b, 0e, 09]; 60 Td3[x] = Si[x].[09, 0d, 0b, 0e]; 61 Td4[x] = Si[x].[01, 01, 01, 01]; 62 */ 63 64 static const u32 Te0[256] = { 65 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 66 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 67 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, 68 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, 69 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, 70 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 71 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 72 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, 73 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, 74 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, 75 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 76 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, 77 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, 78 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, 79 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, 80 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 81 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 82 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, 83 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, 84 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, 85 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 86 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 87 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, 88 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, 89 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, 90 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 91 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 92 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, 93 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, 94 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, 95 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 96 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 97 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, 98 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, 99 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, 100 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 101 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 102 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, 103 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, 104 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, 105 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 106 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 107 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, 108 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, 109 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, 110 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 111 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 112 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, 113 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, 114 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, 115 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 116 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 117 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, 118 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, 119 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, 120 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 121 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 122 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, 123 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, 124 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, 125 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 126 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 127 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, 128 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, 129 }; 130 static const u32 Te1[256] = { 131 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 132 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 133 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, 134 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, 135 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, 136 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 137 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 138 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, 139 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, 140 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, 141 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 142 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 143 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, 144 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, 145 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, 146 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 147 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 148 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, 149 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, 150 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, 151 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 152 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 153 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, 154 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, 155 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, 156 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 157 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 158 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, 159 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, 160 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, 161 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 162 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 163 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, 164 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, 165 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, 166 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 167 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 168 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, 169 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, 170 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, 171 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 172 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 173 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, 174 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, 175 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, 176 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 177 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 178 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, 179 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, 180 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, 181 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 182 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 183 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, 184 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, 185 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, 186 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 187 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 188 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, 189 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, 190 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, 191 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 192 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 193 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, 194 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, 195 }; 196 static const u32 Te2[256] = { 197 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 198 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 199 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, 200 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, 201 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, 202 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 203 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 204 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, 205 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, 206 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, 207 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 208 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, 209 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, 210 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, 211 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, 212 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 213 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 214 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, 215 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, 216 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, 217 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 218 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 219 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, 220 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, 221 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, 222 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 223 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 224 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, 225 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, 226 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, 227 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 228 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 229 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, 230 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, 231 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, 232 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 233 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 234 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, 235 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, 236 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, 237 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 238 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 239 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, 240 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, 241 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, 242 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 243 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 244 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, 245 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, 246 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, 247 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 248 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 249 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, 250 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, 251 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, 252 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 253 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 254 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, 255 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, 256 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, 257 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 258 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 259 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, 260 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, 261 }; 262 static const u32 Te3[256] = { 263 264 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 265 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 266 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, 267 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, 268 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, 269 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 270 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 271 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, 272 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, 273 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, 274 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 275 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, 276 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, 277 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, 278 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, 279 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 280 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 281 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, 282 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, 283 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, 284 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 285 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 286 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, 287 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, 288 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, 289 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 290 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 291 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, 292 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, 293 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, 294 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 295 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 296 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, 297 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, 298 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, 299 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 300 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 301 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, 302 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, 303 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, 304 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 305 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 306 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, 307 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, 308 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, 309 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 310 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 311 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, 312 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, 313 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, 314 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 315 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 316 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, 317 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, 318 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, 319 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 320 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 321 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, 322 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, 323 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, 324 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 325 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 326 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, 327 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, 328 }; 329 static const u32 Te4[256] = { 330 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, 331 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, 332 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, 333 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, 334 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, 335 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, 336 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, 337 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, 338 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, 339 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, 340 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, 341 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, 342 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, 343 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, 344 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, 345 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, 346 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, 347 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, 348 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, 349 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, 350 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, 351 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, 352 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, 353 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, 354 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, 355 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, 356 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, 357 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, 358 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, 359 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, 360 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, 361 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, 362 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, 363 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, 364 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, 365 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, 366 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, 367 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, 368 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, 369 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, 370 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, 371 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, 372 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, 373 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, 374 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, 375 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, 376 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, 377 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, 378 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, 379 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, 380 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, 381 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, 382 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, 383 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, 384 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, 385 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, 386 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, 387 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, 388 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, 389 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, 390 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, 391 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, 392 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, 393 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, 394 }; 395 static const u32 Td0[256] = { 396 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 397 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 398 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, 399 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, 400 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, 401 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 402 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, 403 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, 404 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, 405 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, 406 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 407 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 408 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, 409 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, 410 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, 411 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 412 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 413 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, 414 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, 415 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, 416 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 417 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, 418 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, 419 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, 420 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, 421 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 422 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, 423 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, 424 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, 425 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, 426 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 427 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 428 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, 429 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, 430 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, 431 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 432 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 433 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, 434 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, 435 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, 436 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 437 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 438 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, 439 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, 440 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, 441 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 442 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 443 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, 444 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, 445 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, 446 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 447 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 448 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, 449 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, 450 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, 451 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 452 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 453 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, 454 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, 455 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, 456 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 457 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, 458 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, 459 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, 460 }; 461 static const u32 Td1[256] = { 462 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 463 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, 464 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, 465 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, 466 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, 467 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 468 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, 469 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, 470 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, 471 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, 472 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 473 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 474 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, 475 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, 476 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, 477 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 478 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 479 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, 480 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, 481 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, 482 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 483 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, 484 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, 485 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, 486 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, 487 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 488 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, 489 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, 490 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, 491 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, 492 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 493 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 494 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, 495 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, 496 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, 497 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 498 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 499 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, 500 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, 501 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, 502 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 503 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 504 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, 505 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, 506 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, 507 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 508 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 509 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, 510 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, 511 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, 512 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 513 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 514 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, 515 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, 516 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, 517 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 518 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 519 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, 520 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, 521 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, 522 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 523 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 524 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, 525 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, 526 }; 527 static const u32 Td2[256] = { 528 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 529 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 530 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, 531 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, 532 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, 533 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 534 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 535 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, 536 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, 537 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, 538 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 539 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 540 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, 541 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, 542 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, 543 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 544 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 545 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, 546 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, 547 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, 548 549 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 550 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 551 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, 552 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, 553 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, 554 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 555 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, 556 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, 557 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, 558 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, 559 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 560 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 561 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, 562 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, 563 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, 564 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 565 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 566 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, 567 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, 568 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, 569 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 570 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 571 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, 572 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, 573 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, 574 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 575 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 576 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, 577 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, 578 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, 579 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 580 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 581 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, 582 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, 583 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, 584 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 585 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 586 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, 587 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, 588 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, 589 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 590 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 591 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, 592 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, 593 }; 594 static const u32 Td3[256] = { 595 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 596 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 597 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, 598 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, 599 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, 600 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 601 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 602 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, 603 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, 604 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, 605 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 606 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 607 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, 608 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, 609 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, 610 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 611 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 612 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, 613 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, 614 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, 615 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 616 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 617 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, 618 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, 619 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, 620 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 621 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, 622 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, 623 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, 624 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, 625 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 626 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 627 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, 628 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, 629 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, 630 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 631 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 632 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, 633 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, 634 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, 635 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 636 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 637 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, 638 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, 639 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, 640 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 641 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 642 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, 643 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, 644 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, 645 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 646 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 647 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, 648 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, 649 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, 650 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 651 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 652 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, 653 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, 654 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, 655 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 656 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 657 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, 658 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, 659 }; 660 static const u32 Td4[256] = { 661 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, 662 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, 663 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, 664 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, 665 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, 666 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, 667 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, 668 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, 669 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, 670 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, 671 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, 672 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, 673 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, 674 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, 675 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, 676 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, 677 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, 678 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, 679 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, 680 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, 681 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, 682 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, 683 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, 684 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, 685 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, 686 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, 687 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, 688 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, 689 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, 690 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, 691 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, 692 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, 693 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, 694 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, 695 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, 696 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, 697 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, 698 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, 699 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, 700 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, 701 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, 702 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, 703 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, 704 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, 705 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, 706 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, 707 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, 708 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, 709 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, 710 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, 711 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, 712 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, 713 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, 714 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, 715 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, 716 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, 717 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, 718 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, 719 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, 720 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, 721 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, 722 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, 723 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, 724 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, 725 }; 726 static const u32 rcon[] = { 727 0x01000000, 0x02000000, 0x04000000, 0x08000000, 728 0x10000000, 0x20000000, 0x40000000, 0x80000000, 729 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ 730 }; 731 732 733 #ifdef _MSC_VER 734 #define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) 735 #define GETU32(p) SWAP(*((u32 *)(p))) 736 #define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } 737 #else 738 #define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) 739 #define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } 740 #endif 741 742 /** 743 * Expand the cipher key into the encryption key schedule. 3 744 * 4 * Optimised ANSI C code 5 * 6 * authors: v1.0: Antoon Bosselaers 7 * v2.0: Vincent Rijmen 8 * v2.3: Paulo Barreto 9 * 10 * This code is placed in the public domain. 745 * @return the number of rounds for the given cipher key size. 11 746 */ 12 13 #include "config_xor.h" 14 15 #include <stdio.h> 16 #include <stdlib.h> 17 #include <string.h> 18 19 #ifdef SH_ENCRYPT 20 21 #include "rijndael-alg-fst.h" 22 23 #include "rijndael-boxes-fst.h" 24 25 #if defined(GCC_VERSION_MAJOR) 26 #if (GCC_VERSION_MAJOR > 4) || ((GCC_VERSION_MAJOR == 4) && (GCC_VERSION_MINOR > 4)) 27 #pragma GCC diagnostic ignored "-Wstrict-aliasing" 28 #endif 29 #endif 30 31 int rijndaelKeySched(word8 k[MAXKC][4], word8 W[MAXROUNDS+1][4][4], int ROUNDS) { 32 /* Calculate the necessary round keys 33 * The number of calculations depends on keyBits and blockBits 34 */ 35 int j, r, t, rconpointer = 0; 36 word8 tk[MAXKC][4] = { { 0 } }; /* init for llvm/clang analyzer */ 37 int KC = ROUNDS - 6; 38 word32 tmp; 39 40 for (j = KC-1; j >= 0; j--) { 41 memmove( &(tk[j]), &(k[j]), sizeof(word32)); 42 } 43 r = 0; 44 t = 0; 45 46 /* copy values into round key array */ 47 for (j = 0; (j < KC) && (r < ROUNDS + 1); ) { 48 for (; (j < KC) && (t < 4); j++, t++) { 49 memmove( &(W[r][t]), &(tk[j]), sizeof(word32)); 50 } 51 if (t == 4) { 52 r++; 53 t = 0; 747 int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { 748 int i = 0; 749 u32 temp; 750 751 rk[0] = GETU32(cipherKey ); 752 rk[1] = GETU32(cipherKey + 4); 753 rk[2] = GETU32(cipherKey + 8); 754 rk[3] = GETU32(cipherKey + 12); 755 if (keyBits == 128) { 756 for (;;) { 757 temp = rk[3]; 758 rk[4] = rk[0] ^ 759 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ 760 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ 761 (Te4[(temp ) & 0xff] & 0x0000ff00) ^ 762 (Te4[(temp >> 24) ] & 0x000000ff) ^ 763 rcon[i]; 764 rk[5] = rk[1] ^ rk[4]; 765 rk[6] = rk[2] ^ rk[5]; 766 rk[7] = rk[3] ^ rk[6]; 767 if (++i == 10) { 768 return 10; 769 } 770 rk += 4; 54 771 } 55 772 } 56 57 while (r < ROUNDS + 1) { /* while not enough round key material calculated */ 58 /* calculate new values */ 59 tk[0][0] ^= S[tk[KC-1][1]]; 60 tk[0][1] ^= S[tk[KC-1][2]]; 61 tk[0][2] ^= S[tk[KC-1][3]]; 62 tk[0][3] ^= S[tk[KC-1][0]]; 63 tk[0][0] ^= rcon[rconpointer++]; 64 65 if (KC != 8) { 66 for (j = 1; j < KC; j++) { 67 tmp = *((word32*)tk[j-1]); 68 *((word32*)tk[j]) ^= tmp; 773 rk[4] = GETU32(cipherKey + 16); 774 rk[5] = GETU32(cipherKey + 20); 775 if (keyBits == 192) { 776 for (;;) { 777 temp = rk[ 5]; 778 rk[ 6] = rk[ 0] ^ 779 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ 780 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ 781 (Te4[(temp ) & 0xff] & 0x0000ff00) ^ 782 (Te4[(temp >> 24) ] & 0x000000ff) ^ 783 rcon[i]; 784 rk[ 7] = rk[ 1] ^ rk[ 6]; 785 rk[ 8] = rk[ 2] ^ rk[ 7]; 786 rk[ 9] = rk[ 3] ^ rk[ 8]; 787 if (++i == 8) { 788 return 12; 69 789 } 70 } else { 71 for (j = 1; j < KC/2; j++) { 72 tmp = *((word32*)tk[j-1]); 73 *((word32*)tk[j]) ^= tmp; 790 rk[10] = rk[ 4] ^ rk[ 9]; 791 rk[11] = rk[ 5] ^ rk[10]; 792 rk += 6; 793 } 794 } 795 rk[6] = GETU32(cipherKey + 24); 796 rk[7] = GETU32(cipherKey + 28); 797 if (keyBits == 256) { 798 for (;;) { 799 temp = rk[ 7]; 800 rk[ 8] = rk[ 0] ^ 801 (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ 802 (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ 803 (Te4[(temp ) & 0xff] & 0x0000ff00) ^ 804 (Te4[(temp >> 24) ] & 0x000000ff) ^ 805 rcon[i]; 806 rk[ 9] = rk[ 1] ^ rk[ 8]; 807 rk[10] = rk[ 2] ^ rk[ 9]; 808 rk[11] = rk[ 3] ^ rk[10]; 809 if (++i == 7) { 810 return 14; 74 811 } 75 tk[KC/2][0] ^= S[tk[KC/2 - 1][0]]; 76 tk[KC/2][1] ^= S[tk[KC/2 - 1][1]]; 77 tk[KC/2][2] ^= S[tk[KC/2 - 1][2]]; 78 tk[KC/2][3] ^= S[tk[KC/2 - 1][3]]; 79 for (j = KC/2 + 1; j < KC; j++) { 80 tmp = *((word32*)tk[j-1]); 81 *((word32*)tk[j]) ^= tmp; 82 } 83 } 84 /* copy values into round key array */ 85 for (j = 0; (j < KC) && (r < ROUNDS + 1); ) { 86 for (; (j < KC) && (t < 4); j++, t++) { 87 memmove( &(W[r][t]), &(tk[j]), sizeof(word32)); 88 } 89 if (t == 4) { 90 r++; 91 t = 0; 92 } 93 } 94 } 812 temp = rk[11]; 813 rk[12] = rk[ 4] ^ 814 (Te4[(temp >> 24) ] & 0xff000000) ^ 815 (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ 816 (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ 817 (Te4[(temp ) & 0xff] & 0x000000ff); 818 rk[13] = rk[ 5] ^ rk[12]; 819 rk[14] = rk[ 6] ^ rk[13]; 820 rk[15] = rk[ 7] ^ rk[14]; 821 822 rk += 8; 823 } 824 } 95 825 return 0; 96 826 } 97 827 98 int rijndaelKeyEncToDec(word8 W[MAXROUNDS+1][4][4], int ROUNDS) { 99 int r; 100 word8 *w; 101 102 for (r = 1; r < ROUNDS; r++) { 103 w = W[r][0]; 104 *((word32*)w) = 105 *((word32*)U1[w[0]]) 106 ^ *((word32*)U2[w[1]]) 107 ^ *((word32*)U3[w[2]]) 108 ^ *((word32*)U4[w[3]]); 109 110 w = W[r][1]; 111 *((word32*)w) = 112 *((word32*)U1[w[0]]) 113 ^ *((word32*)U2[w[1]]) 114 ^ *((word32*)U3[w[2]]) 115 ^ *((word32*)U4[w[3]]); 116 117 w = W[r][2]; 118 *((word32*)w) = 119 *((word32*)U1[w[0]]) 120 ^ *((word32*)U2[w[1]]) 121 ^ *((word32*)U3[w[2]]) 122 ^ *((word32*)U4[w[3]]); 123 124 w = W[r][3]; 125 *((word32*)w) = 126 *((word32*)U1[w[0]]) 127 ^ *((word32*)U2[w[1]]) 128 ^ *((word32*)U3[w[2]]) 129 ^ *((word32*)U4[w[3]]); 828 /** 829 * Expand the cipher key into the decryption key schedule. 830 * 831 * @return the number of rounds for the given cipher key size. 832 */ 833 int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) { 834 int Nr, i, j; 835 u32 temp; 836 837 /* expand the cipher key: */ 838 Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); 839 /* invert the order of the round keys: */ 840 for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { 841 temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; 842 temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; 843 temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; 844 temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; 130 845 } 131 return 0; 132 } 133 134 /** 135 * Encrypt a single block. 136 */ 137 int rijndaelEncrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) { 138 int r; 139 union { 140 word32 tem4[4]; 141 word8 temp[4][4]; 142 } tmpU; 143 tmpU.tem4[0] = tmpU.tem4[1] = tmpU.tem4[2] = tmpU.tem4[3] = 0; 144 145 tmpU.tem4[0] = *((word32*)(a )) ^ *((word32*)rk[0][0]); 146 tmpU.tem4[1] = *((word32*)(a+ 4)) ^ *((word32*)rk[0][1]); 147 tmpU.tem4[2] = *((word32*)(a+ 8)) ^ *((word32*)rk[0][2]); 148 tmpU.tem4[3] = *((word32*)(a+12)) ^ *((word32*)rk[0][3]); 149 *((word32*)(b )) = *((word32*)T1[tmpU.temp[0][0]]) 150 ^ *((word32*)T2[tmpU.temp[1][1]]) 151 ^ *((word32*)T3[tmpU.temp[2][2]]) 152 ^ *((word32*)T4[tmpU.temp[3][3]]); 153 *((word32*)(b + 4)) = *((word32*)T1[tmpU.temp[1][0]]) 154 ^ *((word32*)T2[tmpU.temp[2][1]]) 155 ^ *((word32*)T3[tmpU.temp[3][2]]) 156 ^ *((word32*)T4[tmpU.temp[0][3]]); 157 *((word32*)(b + 8)) = *((word32*)T1[tmpU.temp[2][0]]) 158 ^ *((word32*)T2[tmpU.temp[3][1]]) 159 ^ *((word32*)T3[tmpU.temp[0][2]]) 160 ^ *((word32*)T4[tmpU.temp[1][3]]); 161 *((word32*)(b +12)) = *((word32*)T1[tmpU.temp[3][0]]) 162 ^ *((word32*)T2[tmpU.temp[0][1]]) 163 ^ *((word32*)T3[tmpU.temp[1][2]]) 164 ^ *((word32*)T4[tmpU.temp[2][3]]); 165 for (r = 1; r < ROUNDS-1; r++) { 166 tmpU.tem4[0] = *((word32*)(b )) ^ *((word32*)rk[r][0]); 167 tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]); 168 tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]); 169 tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[r][3]); 170 171 *((word32*)(b )) = *((word32*)T1[tmpU.temp[0][0]]) 172 ^ *((word32*)T2[tmpU.temp[1][1]]) 173 ^ *((word32*)T3[tmpU.temp[2][2]]) 174 ^ *((word32*)T4[tmpU.temp[3][3]]); 175 *((word32*)(b + 4)) = *((word32*)T1[tmpU.temp[1][0]]) 176 ^ *((word32*)T2[tmpU.temp[2][1]]) 177 ^ *((word32*)T3[tmpU.temp[3][2]]) 178 ^ *((word32*)T4[tmpU.temp[0][3]]); 179 *((word32*)(b + 8)) = *((word32*)T1[tmpU.temp[2][0]]) 180 ^ *((word32*)T2[tmpU.temp[3][1]]) 181 ^ *((word32*)T3[tmpU.temp[0][2]]) 182 ^ *((word32*)T4[tmpU.temp[1][3]]); 183 *((word32*)(b +12)) = *((word32*)T1[tmpU.temp[3][0]]) 184 ^ *((word32*)T2[tmpU.temp[0][1]]) 185 ^ *((word32*)T3[tmpU.temp[1][2]]) 186 ^ *((word32*)T4[tmpU.temp[2][3]]); 846 /* apply the inverse MixColumn transform to all round keys but the first and the last: */ 847 for (i = 1; i < Nr; i++) { 848 rk += 4; 849 rk[0] = 850 Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ 851 Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ 852 Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ 853 Td3[Te4[(rk[0] ) & 0xff] & 0xff]; 854 rk[1] = 855 Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ 856 Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ 857 Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ 858 Td3[Te4[(rk[1] ) & 0xff] & 0xff]; 859 rk[2] = 860 Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ 861 Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ 862 Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ 863 Td3[Te4[(rk[2] ) & 0xff] & 0xff]; 864 rk[3] = 865 Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ 866 Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ 867 Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ 868 Td3[Te4[(rk[3] ) & 0xff] & 0xff]; 187 869 } 188 /* last round is special */ 189 tmpU.tem4[0] = *((word32*)(b )) ^ *((word32*)rk[ROUNDS-1][0]); 190 tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[ROUNDS-1][1]); 191 tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[ROUNDS-1][2]); 192 tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[ROUNDS-1][3]); 193 b[ 0] = T1[tmpU.temp[0][0]][1]; 194 b[ 1] = T1[tmpU.temp[1][1]][1]; 195 b[ 2] = T1[tmpU.temp[2][2]][1]; 196 b[ 3] = T1[tmpU.temp[3][3]][1]; 197 b[ 4] = T1[tmpU.temp[1][0]][1]; 198 b[ 5] = T1[tmpU.temp[2][1]][1]; 199 b[ 6] = T1[tmpU.temp[3][2]][1]; 200 b[ 7] = T1[tmpU.temp[0][3]][1]; 201 b[ 8] = T1[tmpU.temp[2][0]][1]; 202 b[ 9] = T1[tmpU.temp[3][1]][1]; 203 b[10] = T1[tmpU.temp[0][2]][1]; 204 b[11] = T1[tmpU.temp[1][3]][1]; 205 b[12] = T1[tmpU.temp[3][0]][1]; 206 b[13] = T1[tmpU.temp[0][1]][1]; 207 b[14] = T1[tmpU.temp[1][2]][1]; 208 b[15] = T1[tmpU.temp[2][3]][1]; 209 *((word32*)(b )) ^= *((word32*)rk[ROUNDS][0]); 210 *((word32*)(b+ 4)) ^= *((word32*)rk[ROUNDS][1]); 211 *((word32*)(b+ 8)) ^= *((word32*)rk[ROUNDS][2]); 212 *((word32*)(b+12)) ^= *((word32*)rk[ROUNDS][3]); 213 214 return 0; 870 return Nr; 215 871 } 216 872 217 /** 218 * Decrypt a single block. 219 */ 220 int rijndaelDecrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) { 221 int r; 222 union { 223 word32 tem4[4]; 224 word8 temp[4][4]; 225 } tmpU; 226 tmpU.tem4[0] = tmpU.tem4[1] = tmpU.tem4[2] = tmpU.tem4[3] = 0; 227 228 tmpU.tem4[0] = *((word32*)(a )) ^ *((word32*)rk[ROUNDS][0]); 229 tmpU.tem4[1] = *((word32*)(a+ 4)) ^ *((word32*)rk[ROUNDS][1]); 230 tmpU.tem4[2] = *((word32*)(a+ 8)) ^ *((word32*)rk[ROUNDS][2]); 231 tmpU.tem4[3] = *((word32*)(a+12)) ^ *((word32*)rk[ROUNDS][3]); 232 233 *((word32*)(b )) = *((word32*)T5[tmpU.temp[0][0]]) 234 ^ *((word32*)T6[tmpU.temp[3][1]]) 235 ^ *((word32*)T7[tmpU.temp[2][2]]) 236 ^ *((word32*)T8[tmpU.temp[1][3]]); 237 *((word32*)(b+ 4)) = *((word32*)T5[tmpU.temp[1][0]]) 238 ^ *((word32*)T6[tmpU.temp[0][1]]) 239 ^ *((word32*)T7[tmpU.temp[3][2]]) 240 ^ *((word32*)T8[tmpU.temp[2][3]]); 241 *((word32*)(b+ 8)) = *((word32*)T5[tmpU.temp[2][0]]) 242 ^ *((word32*)T6[tmpU.temp[1][1]]) 243 ^ *((word32*)T7[tmpU.temp[0][2]]) 244 ^ *((word32*)T8[tmpU.temp[3][3]]); 245 *((word32*)(b+12)) = *((word32*)T5[tmpU.temp[3][0]]) 246 ^ *((word32*)T6[tmpU.temp[2][1]]) 247 ^ *((word32*)T7[tmpU.temp[1][2]]) 248 ^ *((word32*)T8[tmpU.temp[0][3]]); 249 for (r = ROUNDS-1; r > 1; r--) { 250 tmpU.tem4[0] = *((word32*)(b )) ^ *((word32*)rk[r][0]); 251 tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[r][1]); 252 tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[r][2]); 253 tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[r][3]); 254 *((word32*)(b )) = *((word32*)T5[tmpU.temp[0][0]]) 255 ^ *((word32*)T6[tmpU.temp[3][1]]) 256 ^ *((word32*)T7[tmpU.temp[2][2]]) 257 ^ *((word32*)T8[tmpU.temp[1][3]]); 258 *((word32*)(b+ 4)) = *((word32*)T5[tmpU.temp[1][0]]) 259 ^ *((word32*)T6[tmpU.temp[0][1]]) 260 ^ *((word32*)T7[tmpU.temp[3][2]]) 261 ^ *((word32*)T8[tmpU.temp[2][3]]); 262 *((word32*)(b+ 8)) = *((word32*)T5[tmpU.temp[2][0]]) 263 ^ *((word32*)T6[tmpU.temp[1][1]]) 264 ^ *((word32*)T7[tmpU.temp[0][2]]) 265 ^ *((word32*)T8[tmpU.temp[3][3]]); 266 *((word32*)(b+12)) = *((word32*)T5[tmpU.temp[3][0]]) 267 ^ *((word32*)T6[tmpU.temp[2][1]]) 268 ^ *((word32*)T7[tmpU.temp[1][2]]) 269 ^ *((word32*)T8[tmpU.temp[0][3]]); 270 } 271 /* last round is special */ 272 tmpU.tem4[0] = *((word32*)(b )) ^ *((word32*)rk[1][0]); 273 tmpU.tem4[1] = *((word32*)(b+ 4)) ^ *((word32*)rk[1][1]); 274 tmpU.tem4[2] = *((word32*)(b+ 8)) ^ *((word32*)rk[1][2]); 275 tmpU.tem4[3] = *((word32*)(b+12)) ^ *((word32*)rk[1][3]); 276 b[ 0] = S5[tmpU.temp[0][0]]; 277 b[ 1] = S5[tmpU.temp[3][1]]; 278 b[ 2] = S5[tmpU.temp[2][2]]; 279 b[ 3] = S5[tmpU.temp[1][3]]; 280 b[ 4] = S5[tmpU.temp[1][0]]; 281 b[ 5] = S5[tmpU.temp[0][1]]; 282 b[ 6] = S5[tmpU.temp[3][2]]; 283 b[ 7] = S5[tmpU.temp[2][3]]; 284 b[ 8] = S5[tmpU.temp[2][0]]; 285 b[ 9] = S5[tmpU.temp[1][1]]; 286 b[10] = S5[tmpU.temp[0][2]]; 287 b[11] = S5[tmpU.temp[3][3]]; 288 b[12] = S5[tmpU.temp[3][0]]; 289 b[13] = S5[tmpU.temp[2][1]]; 290 b[14] = S5[tmpU.temp[1][2]]; 291 b[15] = S5[tmpU.temp[0][3]]; 292 *((word32*)(b )) ^= *((word32*)rk[0][0]); 293 *((word32*)(b+ 4)) ^= *((word32*)rk[0][1]); 294 *((word32*)(b+ 8)) ^= *((word32*)rk[0][2]); 295 *((word32*)(b+12)) ^= *((word32*)rk[0][3]); 296 297 return 0; 873 void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { 874 u32 s0, s1, s2, s3, t0, t1, t2, t3; 875 #ifndef FULL_UNROLL 876 int r; 877 #endif /* ?FULL_UNROLL */ 878 879 /* 880 * map byte array block to cipher state 881 * and add initial round key: 882 */ 883 s0 = GETU32(pt ) ^ rk[0]; 884 s1 = GETU32(pt + 4) ^ rk[1]; 885 s2 = GETU32(pt + 8) ^ rk[2]; 886 s3 = GETU32(pt + 12) ^ rk[3]; 887 #ifdef FULL_UNROLL 888 /* round 1: */ 889 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; 890 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; 891 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; 892 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; 893 /* round 2: */ 894 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; 895 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; 896 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; 897 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; 898 /* round 3: */ 899 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; 900 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; 901 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; 902 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; 903 /* round 4: */ 904 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; 905 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; 906 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; 907 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; 908 /* round 5: */ 909 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; 910 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; 911 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; 912 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; 913 /* round 6: */ 914 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; 915 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; 916 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; 917 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; 918 /* round 7: */ 919 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; 920 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; 921 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; 922 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; 923 /* round 8: */ 924 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; 925 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; 926 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; 927 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; 928 /* round 9: */ 929 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; 930 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; 931 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; 932 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; 933 if (Nr > 10) { 934 /* round 10: */ 935 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; 936 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; 937 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; 938 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; 939 /* round 11: */ 940 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; 941 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; 942 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; 943 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; 944 if (Nr > 12) { 945 /* round 12: */ 946 s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; 947 s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; 948 s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; 949 s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; 950 /* round 13: */ 951 t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; 952 t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; 953 t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; 954 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; 955 } 956 } 957 rk += Nr << 2; 958 #else /* !FULL_UNROLL */ 959 /* 960 * Nr - 1 full rounds: 961 */ 962 r = Nr >> 1; 963 for (;;) { 964 t0 = 965 Te0[(s0 >> 24) ] ^ 966 Te1[(s1 >> 16) & 0xff] ^ 967 Te2[(s2 >> 8) & 0xff] ^ 968 Te3[(s3 ) & 0xff] ^ 969 rk[4]; 970 t1 = 971 Te0[(s1 >> 24) ] ^ 972 Te1[(s2 >> 16) & 0xff] ^ 973 Te2[(s3 >> 8) & 0xff] ^ 974 Te3[(s0 ) & 0xff] ^ 975 rk[5]; 976 t2 = 977 Te0[(s2 >> 24) ] ^ 978 Te1[(s3 >> 16) & 0xff] ^ 979 Te2[(s0 >> 8) & 0xff] ^ 980 Te3[(s1 ) & 0xff] ^ 981 rk[6]; 982 t3 = 983 Te0[(s3 >> 24) ] ^ 984 Te1[(s0 >> 16) & 0xff] ^ 985 Te2[(s1 >> 8) & 0xff] ^ 986 Te3[(s2 ) & 0xff] ^ 987 rk[7]; 988 989 rk += 8; 990 if (--r == 0) { 991 break; 992 } 993 994 s0 = 995 Te0[(t0 >> 24) ] ^ 996 Te1[(t1 >> 16) & 0xff] ^ 997 Te2[(t2 >> 8) & 0xff] ^ 998 Te3[(t3 ) & 0xff] ^ 999 rk[0]; 1000 s1 = 1001 Te0[(t1 >> 24) ] ^ 1002 Te1[(t2 >> 16) & 0xff] ^ 1003 Te2[(t3 >> 8) & 0xff] ^ 1004 Te3[(t0 ) & 0xff] ^ 1005 rk[1]; 1006 s2 = 1007 Te0[(t2 >> 24) ] ^ 1008 Te1[(t3 >> 16) & 0xff] ^ 1009 Te2[(t0 >> 8) & 0xff] ^ 1010 Te3[(t1 ) & 0xff] ^ 1011 rk[2]; 1012 s3 = 1013 Te0[(t3 >> 24) ] ^ 1014 Te1[(t0 >> 16) & 0xff] ^ 1015 Te2[(t1 >> 8) & 0xff] ^ 1016 Te3[(t2 ) & 0xff] ^ 1017 rk[3]; 1018 } 1019 #endif /* ?FULL_UNROLL */ 1020 /* 1021 * apply last round and 1022 * map cipher state to byte array block: 1023 */ 1024 s0 = 1025 (Te4[(t0 >> 24) ] & 0xff000000) ^ 1026 (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ 1027 (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ 1028 (Te4[(t3 ) & 0xff] & 0x000000ff) ^ 1029 rk[0]; 1030 PUTU32(ct , s0); 1031 s1 = 1032 (Te4[(t1 >> 24) ] & 0xff000000) ^ 1033 (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ 1034 (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ 1035 (Te4[(t0 ) & 0xff] & 0x000000ff) ^ 1036 rk[1]; 1037 PUTU32(ct + 4, s1); 1038 s2 = 1039 (Te4[(t2 >> 24) ] & 0xff000000) ^ 1040 (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ 1041 (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ 1042 (Te4[(t1 ) & 0xff] & 0x000000ff) ^ 1043 rk[2]; 1044 PUTU32(ct + 8, s2); 1045 s3 = 1046 (Te4[(t3 >> 24) ] & 0xff000000) ^ 1047 (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ 1048 (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ 1049 (Te4[(t2 ) & 0xff] & 0x000000ff) ^ 1050 rk[3]; 1051 PUTU32(ct + 12, s3); 298 1052 } 299 1053 300 #ifdef INTERMEDIATE_VALUE_KAT 301 /** 302 * Encrypt only a certain number of rounds. 303 * Only used in the Intermediate Value Known Answer Test. 304 */ 305 int rijndaelEncryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) { 306 int r; 307 word8 temp[4][4]; 308 309 /* make number of rounds sane */ 310 if (rounds > ROUNDS) { 311 rounds = ROUNDS; 312 } 313 314 *((word32*)a[0]) = *((word32*)a[0]) ^ *((word32*)rk[0][0]); 315 *((word32*)a[1]) = *((word32*)a[1]) ^ *((word32*)rk[0][1]); 316 *((word32*)a[2]) = *((word32*)a[2]) ^ *((word32*)rk[0][2]); 317 *((word32*)a[3]) = *((word32*)a[3]) ^ *((word32*)rk[0][3]); 318 319 for (r = 1; (r <= rounds) && (r < ROUNDS); r++) { 320 *((word32*)temp[0]) = *((word32*)T1[a[0][0]]) 321 ^ *((word32*)T2[a[1][1]]) 322 ^ *((word32*)T3[a[2][2]]) 323 ^ *((word32*)T4[a[3][3]]); 324 *((word32*)temp[1]) = *((word32*)T1[a[1][0]]) 325 ^ *((word32*)T2[a[2][1]]) 326 ^ *((word32*)T3[a[3][2]]) 327 ^ *((word32*)T4[a[0][3]]); 328 *((word32*)temp[2]) = *((word32*)T1[a[2][0]]) 329 ^ *((word32*)T2[a[3][1]]) 330 ^ *((word32*)T3[a[0][2]]) 331 ^ *((word32*)T4[a[1][3]]); 332 *((word32*)temp[3]) = *((word32*)T1[a[3][0]]) 333 ^ *((word32*)T2[a[0][1]]) 334 ^ *((word32*)T3[a[1][2]]) 335 ^ *((word32*)T4[a[2][3]]); 336 *((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[r][0]); 337 *((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[r][1]); 338 *((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[r][2]); 339 *((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[r][3]); 340 } 341 if (rounds == ROUNDS) { 342 /* last round is special */ 343 temp[0][0] = T1[a[0][0]][1]; 344 temp[0][1] = T1[a[1][1]][1]; 345 temp[0][2] = T1[a[2][2]][1]; 346 temp[0][3] = T1[a[3][3]][1]; 347 temp[1][0] = T1[a[1][0]][1]; 348 temp[1][1] = T1[a[2][1]][1]; 349 temp[1][2] = T1[a[3][2]][1]; 350 temp[1][3] = T1[a[0][3]][1]; 351 temp[2][0] = T1[a[2][0]][1]; 352 temp[2][1] = T1[a[3][1]][1]; 353 temp[2][2] = T1[a[0][2]][1]; 354 temp[2][3] = T1[a[1][3]][1]; 355 temp[3][0] = T1[a[3][0]][1]; 356 temp[3][1] = T1[a[0][1]][1]; 357 temp[3][2] = T1[a[1][2]][1]; 358 temp[3][3] = T1[a[2][3]][1]; 359 *((word32*)a[0]) = *((word32*)temp[0]) ^ *((word32*)rk[ROUNDS][0]); 360 *((word32*)a[1]) = *((word32*)temp[1]) ^ *((word32*)rk[ROUNDS][1]); 361 *((word32*)a[2]) = *((word32*)temp[2]) ^ *((word32*)rk[ROUNDS][2]); 362 *((word32*)a[3]) = *((word32*)temp[3]) ^ *((word32*)rk[ROUNDS][3]); 363 } 364 365 return 0; 366 } 367 #endif /* INTERMEDIATE_VALUE_KAT */ 368 369 #ifdef INTERMEDIATE_VALUE_KAT 370 /** 371 * Decrypt only a certain number of rounds. 372 * Only used in the Intermediate Value Known Answer Test. 373 * Operations rearranged such that the intermediate values 374 * of decryption correspond with the intermediate values 375 * of encryption. 376 */ 377 int rijndaelDecryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS, int rounds) { 378 int r, i; 379 word8 temp[4], shift; 380 381 /* make number of rounds sane */ 382 if (rounds > ROUNDS) { 383 rounds = ROUNDS; 384 } 385 /* first round is special: */ 386 *(word32 *)a[0] ^= *(word32 *)rk[ROUNDS][0]; 387 *(word32 *)a[1] ^= *(word32 *)rk[ROUNDS][1]; 388 *(word32 *)a[2] ^= *(word32 *)rk[ROUNDS][2]; 389 *(word32 *)a[3] ^= *(word32 *)rk[ROUNDS][3]; 390 for (i = 0; i < 4; i++) { 391 a[i][0] = Si[a[i][0]]; 392 a[i][1] = Si[a[i][1]]; 393 a[i][2] = Si[a[i][2]]; 394 a[i][3] = Si[a[i][3]]; 395 } 396 for (i = 1; i < 4; i++) { 397 shift = (4 - i) & 3; 398 temp[0] = a[(0 + shift) & 3][i]; 399 temp[1] = a[(1 + shift) & 3][i]; 400 temp[2] = a[(2 + shift) & 3][i]; 401 temp[3] = a[(3 + shift) & 3][i]; 402 a[0][i] = temp[0]; 403 a[1][i] = temp[1]; 404 a[2][i] = temp[2]; 405 a[3][i] = temp[3]; 406 } 407 /* ROUNDS-1 ordinary rounds */ 408 for (r = ROUNDS-1; r > rounds; r--) { 409 *(word32 *)a[0] ^= *(word32 *)rk[r][0]; 410 *(word32 *)a[1] ^= *(word32 *)rk[r][1]; 411 *(word32 *)a[2] ^= *(word32 *)rk[r][2]; 412 *(word32 *)a[3] ^= *(word32 *)rk[r][3]; 413 414 *((word32*)a[0]) = 415 *((word32*)U1[a[0][0]]) 416 ^ *((word32*)U2[a[0][1]]) 417 ^ *((word32*)U3[a[0][2]]) 418 ^ *((word32*)U4[a[0][3]]); 419 420 *((word32*)a[1]) = 421 *((word32*)U1[a[1][0]]) 422 ^ *((word32*)U2[a[1][1]]) 423 ^ *((word32*)U3[a[1][2]]) 424 ^ *((word32*)U4[a[1][3]]); 425 426 *((word32*)a[2]) = 427 *((word32*)U1[a[2][0]]) 428 ^ *((word32*)U2[a[2][1]]) 429 ^ *((word32*)U3[a[2][2]]) 430 ^ *((word32*)U4[a[2][3]]); 431 432 *((word32*)a[3]) = 433 *((word32*)U1[a[3][0]]) 434 ^ *((word32*)U2[a[3][1]]) 435 ^ *((word32*)U3[a[3][2]]) 436 ^ *((word32*)U4[a[3][3]]); 437 for (i = 0; i < 4; i++) { 438 a[i][0] = Si[a[i][0]]; 439 a[i][1] = Si[a[i][1]]; 440 a[i][2] = Si[a[i][2]]; 441 a[i][3] = Si[a[i][3]]; 442 } 443 for (i = 1; i < 4; i++) { 444 shift = (4 - i) & 3; 445 temp[0] = a[(0 + shift) & 3][i]; 446 temp[1] = a[(1 + shift) & 3][i]; 447 temp[2] = a[(2 + shift) & 3][i]; 448 temp[3] = a[(3 + shift) & 3][i]; 449 a[0][i] = temp[0]; 450 a[1][i] = temp[1]; 451 a[2][i] = temp[2]; 452 a[3][i] = temp[3]; 453 } 454 } 455 if (rounds == 0) { 456 /* End with the extra key addition */ 457 *(word32 *)a[0] ^= *(word32 *)rk[0][0]; 458 *(word32 *)a[1] ^= *(word32 *)rk[0][1]; 459 *(word32 *)a[2] ^= *(word32 *)rk[0][2]; 460 *(word32 *)a[3] ^= *(word32 *)rk[0][3]; 461 } 462 return 0; 1054 void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { 1055 u32 s0, s1, s2, s3, t0, t1, t2, t3; 1056 #ifndef FULL_UNROLL 1057 int r; 1058 #endif /* ?FULL_UNROLL */ 1059 1060 /* 1061 * map byte array block to cipher state 1062 * and add initial round key: 1063 */ 1064 s0 = GETU32(ct ) ^ rk[0]; 1065 s1 = GETU32(ct + 4) ^ rk[1]; 1066 s2 = GETU32(ct + 8) ^ rk[2]; 1067 s3 = GETU32(ct + 12) ^ rk[3]; 1068 #ifdef FULL_UNROLL 1069 /* round 1: */ 1070 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; 1071 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; 1072 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; 1073 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; 1074 /* round 2: */ 1075 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; 1076 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; 1077 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; 1078 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; 1079 /* round 3: */ 1080 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; 1081 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; 1082 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; 1083 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; 1084 /* round 4: */ 1085 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; 1086 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; 1087 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; 1088 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; 1089 /* round 5: */ 1090 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; 1091 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; 1092 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; 1093 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; 1094 /* round 6: */ 1095 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; 1096 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; 1097 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; 1098 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; 1099 /* round 7: */ 1100 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; 1101 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; 1102 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; 1103 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; 1104 /* round 8: */ 1105 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; 1106 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; 1107 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; 1108 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; 1109 /* round 9: */ 1110 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; 1111 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; 1112 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; 1113 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; 1114 if (Nr > 10) { 1115 /* round 10: */ 1116 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; 1117 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; 1118 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; 1119 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; 1120 /* round 11: */ 1121 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; 1122 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; 1123 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; 1124 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; 1125 if (Nr > 12) { 1126 /* round 12: */ 1127 s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; 1128 s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; 1129 s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; 1130 s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; 1131 /* round 13: */ 1132 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; 1133 t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; 1134 t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; 1135 t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; 1136 } 1137 } 1138 rk += Nr << 2; 1139 #else /* !FULL_UNROLL */ 1140 /* 1141 * Nr - 1 full rounds: 1142 */ 1143 r = Nr >> 1; 1144 for (;;) { 1145 t0 = 1146 Td0[(s0 >> 24) ] ^ 1147 Td1[(s3 >> 16) & 0xff] ^ 1148 Td2[(s2 >> 8) & 0xff] ^ 1149 Td3[(s1 ) & 0xff] ^ 1150 rk[4]; 1151 t1 = 1152 Td0[(s1 >> 24) ] ^ 1153 Td1[(s0 >> 16) & 0xff] ^ 1154 Td2[(s3 >> 8) & 0xff] ^ 1155 Td3[(s2 ) & 0xff] ^ 1156 rk[5]; 1157 t2 = 1158 Td0[(s2 >> 24) ] ^ 1159 Td1[(s1 >> 16) & 0xff] ^ 1160 Td2[(s0 >> 8) & 0xff] ^ 1161 Td3[(s3 ) & 0xff] ^ 1162 rk[6]; 1163 t3 = 1164 Td0[(s3 >> 24) ] ^ 1165 Td1[(s2 >> 16) & 0xff] ^ 1166 Td2[(s1 >> 8) & 0xff] ^ 1167 Td3[(s0 ) & 0xff] ^ 1168 rk[7]; 1169 1170 rk += 8; 1171 if (--r == 0) { 1172 break; 1173 } 1174 1175 s0 = 1176 Td0[(t0 >> 24) ] ^ 1177 Td1[(t3 >> 16) & 0xff] ^ 1178 Td2[(t2 >> 8) & 0xff] ^ 1179 Td3[(t1 ) & 0xff] ^ 1180 rk[0]; 1181 s1 = 1182 Td0[(t1 >> 24) ] ^ 1183 Td1[(t0 >> 16) & 0xff] ^ 1184 Td2[(t3 >> 8) & 0xff] ^ 1185 Td3[(t2 ) & 0xff] ^ 1186 rk[1]; 1187 s2 = 1188 Td0[(t2 >> 24) ] ^ 1189 Td1[(t1 >> 16) & 0xff] ^ 1190 Td2[(t0 >> 8) & 0xff] ^ 1191 Td3[(t3 ) & 0xff] ^ 1192 rk[2]; 1193 s3 = 1194 Td0[(t3 >> 24) ] ^ 1195 Td1[(t2 >> 16) & 0xff] ^ 1196 Td2[(t1 >> 8) & 0xff] ^ 1197 Td3[(t0 ) & 0xff] ^ 1198 rk[3]; 1199 } 1200 #endif /* ?FULL_UNROLL */ 1201 /* 1202 * apply last round and 1203 * map cipher state to byte array block: 1204 */ 1205 s0 = 1206 (Td4[(t0 >> 24) ] & 0xff000000) ^ 1207 (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ 1208 (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ 1209 (Td4[(t1 ) & 0xff] & 0x000000ff) ^ 1210 rk[0]; 1211 PUTU32(pt , s0); 1212 s1 = 1213 (Td4[(t1 >> 24) ] & 0xff000000) ^ 1214 (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ 1215 (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ 1216 (Td4[(t2 ) & 0xff] & 0x000000ff) ^ 1217 rk[1]; 1218 PUTU32(pt + 4, s1); 1219 s2 = 1220 (Td4[(t2 >> 24) ] & 0xff000000) ^ 1221 (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ 1222 (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ 1223 (Td4[(t3 ) & 0xff] & 0x000000ff) ^ 1224 rk[2]; 1225 PUTU32(pt + 8, s2); 1226 s3 = 1227 (Td4[(t3 >> 24) ] & 0xff000000) ^ 1228 (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ 1229 (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ 1230 (Td4[(t0 ) & 0xff] & 0x000000ff) ^ 1231 rk[3]; 1232 PUTU32(pt + 12, s3); 463 1233 } 464 #endif /* INTERMEDIATE_VALUE_KAT */ 1234 465 1235 #endif -
trunk/src/rijndael-api-fst.c
r230 r481 1 /* 2 * rijndael-api-fst.c v2.3 April '2000 3 * 4 * Optimised ANSI C code 5 * 6 * authors: v1.0: Antoon Bosselaers 7 * v2.0: Vincent Rijmen 8 * v2.1: Vincent Rijmen 9 * v2.2: Vincent Rijmen 10 * v2.3: Paulo Barreto 11 * v2.4: Vincent Rijmen 12 * 13 * This code is placed in the public domain. 1 /* $NetBSD: rijndael-api-fst.c,v 1.24 2011/05/14 16:46:55 jmmv Exp $ */ 2 3 /** 4 * rijndael-api-fst.c 5 * 6 * @version 2.9 (December 2000) 7 * 8 * Optimised ANSI C code for the Rijndael cipher (now AES) 9 * 10 * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be> 11 * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be> 12 * @author Paulo Barreto <paulo.barreto@terra.com.br> 13 * 14 * This code is hereby placed in the public domain. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS 17 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Acknowledgements: 29 * 30 * We are deeply indebted to the following people for their bug reports, 31 * fixes, and improvement suggestions to this implementation. Though we 32 * tried to list all contributions, we apologise in advance for any 33 * missing reference. 34 * 35 * Andrew Bales <Andrew.Bales@Honeywell.com> 36 * Markus Friedl <markus.friedl@informatik.uni-erlangen.de> 37 * John Skodon <skodonj@webquill.com> 14 38 */ 15 16 39 #include "config_xor.h" 17 40 18 #include <stdio.h>19 #include <assert.h>20 41 #include <stdlib.h> 21 42 #include <string.h> 22 43 44 23 45 #ifdef SH_ENCRYPT 24 46 25 47 #include "rijndael-api-fst.h" 26 48 27 int makeKey(keyInstance *key, RIJ_BYTE direction, int keyLen, char *keyMaterial) { 28 word8 k[MAXKC][4]; 29 int i; 30 char *keyMat; 31 32 if (key == NULL) { 33 return BAD_KEY_INSTANCE; 34 } 35 36 if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) { 37 key->direction = direction; 38 } else { 39 return BAD_KEY_DIR; 40 } 41 42 if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) { 43 key->keyLen = keyLen; 44 } else { 45 return BAD_KEY_MAT; 46 } 47 48 if (keyMaterial != NULL) { 49 strncpy(key->keyMaterial, keyMaterial, keyLen/4); 50 } 51 52 key->ROUNDS = keyLen/32 + 6; 53 54 /* initialize key schedule: */ 55 keyMat = key->keyMaterial; 56 #ifndef BINARY_KEY_MATERIAL 57 for (i = 0; i < key->keyLen/8; i++) { 58 int t, j; 59 60 t = *keyMat++; 61 if ((t >= '0') && (t <= '9')) j = (t - '0') << 4; 62 else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4; 63 else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4; 64 else return BAD_KEY_MAT; 65 66 t = *keyMat++; 67 if ((t >= '0') && (t <= '9')) j ^= (t - '0'); 68 else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10); 69 else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10); 70 else return BAD_KEY_MAT; 71 72 k[i >> 2][i & 3] = (word8)j; 73 } 74 #else 75 for (i = 0; i < key->keyLen/8; i++) { 76 k[i >> 2][i & 3] = (word8)keyMat[i]; 77 } 78 #endif /* ?BINARY_KEY_MATERIAL */ 79 rijndaelKeySched(k, key->keySched, key->ROUNDS); 80 if (direction == DIR_DECRYPT) { 81 rijndaelKeyEncToDec(key->keySched, key->ROUNDS); 82 } 83 84 return TRUE; 85 } 86 87 int cipherInit(cipherInstance *cipher, RIJ_BYTE mode, char *IV) { 88 if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) { 89 cipher->mode = mode; 90 } else { 91 return BAD_CIPHER_MODE; 92 } 93 if (IV != NULL) { 94 #ifndef BINARY_KEY_MATERIAL 95 int i; 96 for (i = 0; i < MAX_IV_SIZE; i++) { 97 int t, j; 98 99 t = IV[2*i]; 100 if ((t >= '0') && (t <= '9')) j = (t - '0') << 4; 101 else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4; 102 else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4; 103 else return BAD_CIPHER_INSTANCE; 104 105 t = IV[2*i+1]; 106 if ((t >= '0') && (t <= '9')) j ^= (t - '0'); 107 else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10); 108 else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10); 109 else return BAD_CIPHER_INSTANCE; 110 111 cipher->IV[i] = (word8)j; 112 } 113 #else 114 memcpy(cipher->IV, IV, MAX_IV_SIZE); 115 #endif /* ?BINARY_KEY_MATERIAL */ 116 } else { 117 memset(cipher->IV, 0, MAX_IV_SIZE); 118 } 119 return TRUE; 120 } 121 122 int blockEncrypt(cipherInstance *cipher, keyInstance *key, 123 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer) { 124 int i, k, numBlocks; 125 union { 126 word32 bloc4[4]; 127 word8 block[16]; 128 } bb; 129 union { 130 word32 i4[4]; 131 word8 iv[4][4]; 132 } iu; 133 134 if (cipher == NULL || 135 key == NULL || 136 key->direction == DIR_DECRYPT) { 137 return BAD_CIPHER_STATE; 138 } 139 if (input == NULL || inputLen <= 0) { 140 return 0; /* nothing to do */ 141 } 142 143 numBlocks = inputLen/128; 144 145 switch (cipher->mode) { 146 case MODE_ECB: 147 for (i = numBlocks; i > 0; i--) { 148 rijndaelEncrypt(input, outBuffer, key->keySched, key->ROUNDS); 149 input += 16; 150 outBuffer += 16; 151 } 152 break; 153 154 case MODE_CBC: 155 /* fix the memory alignment for HP-UX 10.20 156 * R. Wichmann Mon Jun 18 22:36:55 CEST 2001 157 */ 158 #if STRICT_ALIGN 159 memcpy(iu.iv, cipher->IV, 16); 160 bb.bloc4[0] = iu.i4[0] ^ ((word32*)input)[0]; 161 bb.bloc4[1] = iu.i4[1] ^ ((word32*)input)[1]; 162 bb.bloc4[2] = iu.i4[2] ^ ((word32*)input)[2]; 163 bb.bloc4[3] = iu.i4[3] ^ ((word32*)input)[3]; 164 #else /* !STRICT_ALIGN */ 165 ((word32*)block)[0] = ((word32*)cipher->IV)[0] ^ ((word32*)input)[0]; 166 ((word32*)block)[1] = ((word32*)cipher->IV)[1] ^ ((word32*)input)[1]; 167 ((word32*)block)[2] = ((word32*)cipher->IV)[2] ^ ((word32*)input)[2]; 168 ((word32*)block)[3] = ((word32*)cipher->IV)[3] ^ ((word32*)input)[3]; 169 #endif /* ?STRICT_ALIGN */ 170 rijndaelEncrypt(bb.block, outBuffer, key->keySched, key->ROUNDS); 171 input += 16; 172 for (i = numBlocks - 1; i > 0; i--) { 173 bb.bloc4[0] = ((word32*)outBuffer)[0] ^ ((word32*)input)[0]; 174 bb.bloc4[1] = ((word32*)outBuffer)[1] ^ ((word32*)input)[1]; 175 bb.bloc4[2] = ((word32*)outBuffer)[2] ^ ((word32*)input)[2]; 176 bb.bloc4[3] = ((word32*)outBuffer)[3] ^ ((word32*)input)[3]; 177 outBuffer += 16; 178 rijndaelEncrypt(bb.block, outBuffer, key->keySched, key->ROUNDS); 179 input += 16; 180 } 181 break; 182 183 case MODE_CFB1: 184 #if STRICT_ALIGN 185 memcpy(iu.iv, cipher->IV, 16); 186 #else /* !STRICT_ALIGN */ 187 *((word32*)iv[0]) = *((word32*)(cipher->IV )); 188 *((word32*)iv[1]) = *((word32*)(cipher->IV+ 4)); 189 *((word32*)iv[2]) = *((word32*)(cipher->IV+ 8)); 190 *((word32*)iv[3]) = *((word32*)(cipher->IV+12)); 191 #endif /* ?STRICT_ALIGN */ 192 for (i = numBlocks; i > 0; i--) { 193 for (k = 0; k < 128; k++) { 194 bb.bloc4[0] = iu.i4[0]; 195 bb.bloc4[1] = iu.i4[1]; 196 bb.bloc4[2] = iu.i4[2]; 197 bb.bloc4[3] = iu.i4[3]; 198 rijndaelEncrypt(bb.block, bb.block, key->keySched, key->ROUNDS); 199 outBuffer[k/8] ^= (bb.block[0] & 0x80) >> (k & 7); 200 iu.iv[0][0] = (iu.iv[0][0] << 1) | (iu.iv[0][1] >> 7); 201 iu.iv[0][1] = (iu.iv[0][1] << 1) | (iu.iv[0][2] >> 7); 202 iu.iv[0][2] = (iu.iv[0][2] << 1) | (iu.iv[0][3] >> 7); 203 iu.iv[0][3] = (iu.iv[0][3] << 1) | (iu.iv[1][0] >> 7); 204 iu.iv[1][0] = (iu.iv[1][0] << 1) | (iu.iv[1][1] >> 7); 205 iu.iv[1][1] = (iu.iv[1][1] << 1) | (iu.iv[1][2] >> 7); 206 iu.iv[1][2] = (iu.iv[1][2] << 1) | (iu.iv[1][3] >> 7); 207 iu.iv[1][3] = (iu.iv[1][3] << 1) | (iu.iv[2][0] >> 7); 208 iu.iv[2][0] = (iu.iv[2][0] << 1) | (iu.iv[2][1] >> 7); 209 iu.iv[2][1] = (iu.iv[2][1] << 1) | (iu.iv[2][2] >> 7); 210 iu.iv[2][2] = (iu.iv[2][2] << 1) | (iu.iv[2][3] >> 7); 211 iu.iv[2][3] = (iu.iv[2][3] << 1) | (iu.iv[3][0] >> 7); 212 iu.iv[3][0] = (iu.iv[3][0] << 1) | (iu.iv[3][1] >> 7); 213 iu.iv[3][1] = (iu.iv[3][1] << 1) | (iu.iv[3][2] >> 7); 214 iu.iv[3][2] = (iu.iv[3][2] << 1) | (iu.iv[3][3] >> 7); 215 iu.iv[3][3] = (iu.iv[3][3] << 1) | ((outBuffer[k/8] >> (7-(k&7))) & 1); 216 } 217 } 218 break; 219 220 default: 221 return BAD_CIPHER_STATE; 222 } 223 224 return 128*numBlocks; 225 } 226 227 int blockDecrypt(cipherInstance *cipher, keyInstance *key, 228 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer) { 229 int i, k, numBlocks; 230 union { 231 word32 bloc4[4]; 232 word8 block[16]; 233 } bb; 234 union { 235 word32 i4[4]; 236 word8 iv[4][4]; 237 } iu; 238 239 if (cipher == NULL || 240 key == NULL || 241 ((cipher->mode != MODE_CFB1) && (key->direction == DIR_ENCRYPT))) { 242 return BAD_CIPHER_STATE; 243 } 244 if (input == NULL || inputLen <= 0) { 245 return 0; /* nothing to do */ 246 } 247 248 numBlocks = inputLen/128; 249 250 switch (cipher->mode) { 251 case MODE_ECB: 252 for (i = numBlocks; i > 0; i--) { 253 rijndaelDecrypt(input, outBuffer, key->keySched, key->ROUNDS); 254 input += 16; 255 outBuffer += 16; 256 } 257 break; 258 259 case MODE_CBC: 260 #if STRICT_ALIGN 261 memcpy(iu.iv, cipher->IV, 16); 262 #else 263 *((word32*)iu.i4[0]) = *((word32*)(cipher->IV )); 264 *((word32*)iu.i4[1]) = *((word32*)(cipher->IV+ 4)); 265 *((word32*)iu.i4[2]) = *((word32*)(cipher->IV+ 8)); 266 *((word32*)iu.i4[3]) = *((word32*)(cipher->IV+12)); 49 static void xor16(u8 *d, const u8 *a, const u8* b) 50 { 51 size_t i; 52 53 for (i = 0; i < 4; i++) { 54 *d++ = *a++ ^ *b++; 55 *d++ = *a++ ^ *b++; 56 *d++ = *a++ ^ *b++; 57 *d++ = *a++ ^ *b++; 58 } 59 } 60 61 int 62 rijndael_makeKey(keyInstance *key, BYTE direction, int keyLen, 63 const char *keyMaterial) 64 { 65 u8 cipherKey[RIJNDAEL_MAXKB]; 66 int i; 67 68 if (key == NULL) { 69 return BAD_KEY_INSTANCE; 70 } 71 72 if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) { 73 key->direction = direction; 74 } else { 75 return BAD_KEY_DIR; 76 } 77 78 if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) { 79 key->keyLen = keyLen; 80 } else { 81 return BAD_KEY_MAT; 82 } 83 84 if (keyMaterial != NULL) { 85 char temp[RIJNDAEL_MAX_KEY_SIZE]; 86 for (i = 0; i < key->keyLen/8; i++) { 87 int t, j; 88 89 t = *keyMaterial++; 90 if ((t >= '0') && (t <= '9')) j = (t - '0') << 4; 91 else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4; 92 else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4; 93 else return BAD_KEY_MAT; 94 95 t = *keyMaterial++; 96 if ((t >= '0') && (t <= '9')) j ^= (t - '0'); 97 else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10); 98 else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10); 99 else return BAD_KEY_MAT; 100 101 temp[i] = (u8)j; 102 } 103 104 /* memcpy(key->keyMaterial, keyMaterial, keyLen/8); */ 105 memcpy(key->keyMaterial, temp, keyLen/8); 106 } 107 108 /* initialize key schedule: */ 109 memcpy(cipherKey, key->keyMaterial, keyLen/8); 110 if (direction == DIR_ENCRYPT) { 111 key->Nr = rijndaelKeySetupEnc(key->rk, cipherKey, keyLen); 112 } else { 113 key->Nr = rijndaelKeySetupDec(key->rk, cipherKey, keyLen); 114 } 115 rijndaelKeySetupEnc(key->ek, cipherKey, keyLen); 116 return TRUE; 117 } 118 119 int 120 rijndael_cipherInit(cipherInstance *cipher, BYTE mode, const char *IV) 121 { 122 if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) { 123 cipher->mode = mode; 124 } else { 125 return BAD_CIPHER_MODE; 126 } 127 if (IV != NULL) { 128 memcpy(cipher->IV, IV, RIJNDAEL_MAX_IV_SIZE); 129 } else { 130 memset(cipher->IV, 0, RIJNDAEL_MAX_IV_SIZE); 131 } 132 return TRUE; 133 } 134 135 int 136 rijndael_blockEncrypt(cipherInstance *cipher, keyInstance *key, 137 const BYTE *input, int inputLen, BYTE *outBuffer) 138 { 139 int i, k, t, numBlocks; 140 u8 block[16], *iv; 141 142 if (cipher == NULL || 143 key == NULL || 144 key->direction == DIR_DECRYPT) { 145 return BAD_CIPHER_STATE; 146 } 147 if (input == NULL || inputLen <= 0) { 148 return 0; /* nothing to do */ 149 } 150 151 numBlocks = inputLen/128; 152 153 switch (cipher->mode) { 154 case MODE_ECB: 155 for (i = numBlocks; i > 0; i--) { 156 rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); 157 input += 16; 158 outBuffer += 16; 159 } 160 break; 161 162 case MODE_CBC: 163 iv = (u8 *)cipher->IV; 164 for (i = numBlocks; i > 0; i--) { 165 xor16(block, input, iv); 166 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 167 iv = outBuffer; 168 input += 16; 169 outBuffer += 16; 170 } 171 break; 172 173 case MODE_CFB1: 174 iv = (u8 *)cipher->IV; 175 for (i = numBlocks; i > 0; i--) { 176 memcpy(outBuffer, input, 16); 177 for (k = 0; k < 128; k++) { 178 rijndaelEncrypt(key->ek, key->Nr, iv, block); 179 outBuffer[k >> 3] ^= 180 (block[0] & 0x80U) >> (k & 7); 181 for (t = 0; t < 15; t++) { 182 iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); 183 } 184 iv[15] = (iv[15] << 1) | 185 ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1); 186 } 187 outBuffer += 16; 188 input += 16; 189 } 190 break; 191 192 default: 193 return BAD_CIPHER_STATE; 194 } 195 196 return 128 * numBlocks; 197 } 198 199 /** 200 * Encrypt data partitioned in octets, using RFC 2040-like padding. 201 * 202 * @param input data to be encrypted (octet sequence) 203 * @param inputOctets input length in octets (not bits) 204 * @param outBuffer encrypted output data 205 * 206 * @return length in octets (not bits) of the encrypted output buffer. 207 */ 208 int 209 rijndael_padEncrypt(cipherInstance *cipher, keyInstance *key, 210 const BYTE *input, int inputOctets, BYTE *outBuffer) 211 { 212 int i, numBlocks, padLen; 213 u8 block[16], *iv; 214 215 if (cipher == NULL || 216 key == NULL || 217 key->direction == DIR_DECRYPT) { 218 return BAD_CIPHER_STATE; 219 } 220 if (input == NULL || inputOctets <= 0) { 221 return 0; /* nothing to do */ 222 } 223 224 numBlocks = inputOctets / 16; 225 226 switch (cipher->mode) { 227 case MODE_ECB: 228 for (i = numBlocks; i > 0; i--) { 229 rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); 230 input += 16; 231 outBuffer += 16; 232 } 233 padLen = 16 - (inputOctets - 16*numBlocks); 234 memcpy(block, input, 16 - padLen); 235 memset(block + 16 - padLen, padLen, padLen); 236 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 237 break; 238 239 case MODE_CBC: 240 iv = (u8 *)cipher->IV; 241 for (i = numBlocks; i > 0; i--) { 242 xor16(block, input, iv); 243 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 244 iv = outBuffer; 245 input += 16; 246 outBuffer += 16; 247 } 248 padLen = 16 - (inputOctets - 16*numBlocks); 249 for (i = 0; i < 16 - padLen; i++) { 250 block[i] = input[i] ^ iv[i]; 251 } 252 for (i = 16 - padLen; i < 16; i++) { 253 block[i] = (BYTE)padLen ^ iv[i]; 254 } 255 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 256 break; 257 258 default: 259 return BAD_CIPHER_STATE; 260 } 261 262 return 16 * (numBlocks + 1); 263 } 264 265 int 266 rijndael_blockDecrypt(cipherInstance *cipher, keyInstance *key, 267 const BYTE *input, int inputLen, BYTE *outBuffer) 268 { 269 int i, k, t, numBlocks; 270 u8 block[16], *iv; 271 272 if (cipher == NULL || 273 key == NULL || 274 (cipher->mode != MODE_CFB1 && key->direction == DIR_ENCRYPT)) { 275 return BAD_CIPHER_STATE; 276 } 277 if (input == NULL || inputLen <= 0) { 278 return 0; /* nothing to do */ 279 } 280 281 numBlocks = inputLen/128; 282 283 switch (cipher->mode) { 284 case MODE_ECB: 285 for (i = numBlocks; i > 0; i--) { 286 rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); 287 input += 16; 288 outBuffer += 16; 289 } 290 break; 291 292 case MODE_CBC: 293 iv = (u8 *)cipher->IV; 294 for (i = numBlocks; i > 0; i--) { 295 rijndaelDecrypt(key->rk, key->Nr, input, block); 296 xor16(block, block, iv); 297 if (numBlocks > 1) 298 memcpy(cipher->IV, input, 16); 299 memcpy(outBuffer, block, 16); 300 input += 16; 301 outBuffer += 16; 302 } 303 break; 304 305 case MODE_CFB1: 306 iv = (u8 *)cipher->IV; 307 for (i = numBlocks; i > 0; i--) { 308 memcpy(outBuffer, input, 16); 309 for (k = 0; k < 128; k++) { 310 rijndaelEncrypt(key->ek, key->Nr, iv, block); 311 for (t = 0; t < 15; t++) { 312 iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7); 313 } 314 iv[15] = (iv[15] << 1) | 315 ((input[k >> 3] >> (7 - (k & 7))) & 1); 316 outBuffer[k >> 3] ^= (block[0] & 0x80U) >> 317 (k & 7); 318 } 319 outBuffer += 16; 320 input += 16; 321 } 322 break; 323 324 default: 325 return BAD_CIPHER_STATE; 326 } 327 328 return 128 * numBlocks; 329 } 330 331 int 332 rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key, 333 const BYTE *input, int inputOctets, BYTE *outBuffer) 334 { 335 int i, numBlocks, padLen; 336 u8 block[16], *iv; 337 338 if (cipher == NULL || 339 key == NULL || 340 key->direction == DIR_ENCRYPT) { 341 return BAD_CIPHER_STATE; 342 } 343 if (input == NULL || inputOctets <= 0) { 344 return 0; /* nothing to do */ 345 } 346 if (inputOctets % 16 != 0) { 347 return BAD_DATA; 348 } 349 350 numBlocks = inputOctets/16; 351 352 switch (cipher->mode) { 353 case MODE_ECB: 354 /* all blocks but last */ 355 for (i = numBlocks - 1; i > 0; i--) { 356 rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); 357 input += 16; 358 outBuffer += 16; 359 } 360 /* last block */ 361 rijndaelDecrypt(key->rk, key->Nr, input, block); 362 padLen = block[15]; 363 if (padLen >= 16) { 364 return BAD_DATA; 365 } 366 for (i = 16 - padLen; i < 16; i++) { 367 if (block[i] != padLen) { 368 return BAD_DATA; 369 } 370 } 371 memcpy(outBuffer, block, 16 - padLen); 372 break; 373 374 case MODE_CBC: 375 iv = (u8 *)cipher->IV; 376 /* all blocks but last */ 377 for (i = numBlocks - 1; i > 0; i--) { 378 rijndaelDecrypt(key->rk, key->Nr, input, block); 379 xor16(block, block, iv); 380 memcpy(cipher->IV, input, 16); 381 memcpy(outBuffer, block, 16); 382 input += 16; 383 outBuffer += 16; 384 } 385 /* last block */ 386 rijndaelDecrypt(key->rk, key->Nr, input, block); 387 xor16(block, block, iv); 388 padLen = block[15]; 389 if (padLen <= 0 || padLen > 16) { 390 return BAD_DATA; 391 } 392 for (i = 16 - padLen; i < 16; i++) { 393 if (block[i] != padLen) { 394 return BAD_DATA; 395 } 396 } 397 memcpy(outBuffer, block, 16 - padLen); 398 break; 399 400 default: 401 return BAD_CIPHER_STATE; 402 } 403 404 return 16 * numBlocks - padLen; 405 } 406 267 407 #endif 268 for (i = numBlocks; i > 0; i--) {269 rijndaelDecrypt(input, bb.block, key->keySched, key->ROUNDS);270 bb.bloc4[0] ^= iu.i4[0];271 bb.bloc4[1] ^= iu.i4[1];272 bb.bloc4[2] ^= iu.i4[2];273 bb.bloc4[3] ^= iu.i4[3];274 #if STRICT_ALIGN275 memcpy(iu.iv, input, 16);276 memcpy(outBuffer, bb.block, 16);277 #else278 *((word32*)iv[0]) = ((word32*)input)[0]; ((word32*)outBuffer)[0] = ((word32*)block)[0];279 *((word32*)iv[1]) = ((word32*)input)[1]; ((word32*)outBuffer)[1] = ((word32*)block)[1];280 *((word32*)iv[2]) = ((word32*)input)[2]; ((word32*)outBuffer)[2] = ((word32*)block)[2];281 *((word32*)iv[3]) = ((word32*)input)[3]; ((word32*)outBuffer)[3] = ((word32*)block)[3];282 #endif283 input += 16;284 outBuffer += 16;285 }286 break;287 288 case MODE_CFB1:289 #if STRICT_ALIGN290 memcpy(iu.iv, cipher->IV, 16);291 #else292 *((word32*)iv[0]) = *((word32*)(cipher->IV));293 *((word32*)iv[1]) = *((word32*)(cipher->IV+ 4));294 *((word32*)iv[2]) = *((word32*)(cipher->IV+ 8));295 *((word32*)iv[3]) = *((word32*)(cipher->IV+12));296 #endif297 for (i = numBlocks; i > 0; i--) {298 for (k = 0; k < 128; k++) {299 bb.bloc4[0] = iu.i4[0];300 bb.bloc4[1] = iu.i4[1];301 bb.bloc4[2] = iu.i4[2];302 bb.bloc4[3] = iu.i4[3];303 rijndaelEncrypt(bb.block, bb.block, key->keySched, key->ROUNDS);304 iu.iv[0][0] = (iu.iv[0][0] << 1) | (iu.iv[0][1] >> 7);305 iu.iv[0][1] = (iu.iv[0][1] << 1) | (iu.iv[0][2] >> 7);306 iu.iv[0][2] = (iu.iv[0][2] << 1) | (iu.iv[0][3] >> 7);307 iu.iv[0][3] = (iu.iv[0][3] << 1) | (iu.iv[1][0] >> 7);308 iu.iv[1][0] = (iu.iv[1][0] << 1) | (iu.iv[1][1] >> 7);309 iu.iv[1][1] = (iu.iv[1][1] << 1) | (iu.iv[1][2] >> 7);310 iu.iv[1][2] = (iu.iv[1][2] << 1) | (iu.iv[1][3] >> 7);311 iu.iv[1][3] = (iu.iv[1][3] << 1) | (iu.iv[2][0] >> 7);312 iu.iv[2][0] = (iu.iv[2][0] << 1) | (iu.iv[2][1] >> 7);313 iu.iv[2][1] = (iu.iv[2][1] << 1) | (iu.iv[2][2] >> 7);314 iu.iv[2][2] = (iu.iv[2][2] << 1) | (iu.iv[2][3] >> 7);315 iu.iv[2][3] = (iu.iv[2][3] << 1) | (iu.iv[3][0] >> 7);316 iu.iv[3][0] = (iu.iv[3][0] << 1) | (iu.iv[3][1] >> 7);317 iu.iv[3][1] = (iu.iv[3][1] << 1) | (iu.iv[3][2] >> 7);318 iu.iv[3][2] = (iu.iv[3][2] << 1) | (iu.iv[3][3] >> 7);319 iu.iv[3][3] = (iu.iv[3][3] << 1) | ((input[k/8] >> (7-(k&7))) & 1);320 outBuffer[k/8] ^= (bb.block[0] & 0x80) >> (k & 7);321 }322 }323 break;324 325 default:326 return BAD_CIPHER_STATE;327 }328 329 return 128*numBlocks;330 }331 #ifdef INTERMEDIATE_VALUE_KAT332 /**333 * cipherUpdateRounds:334 *335 * Encrypts/Decrypts exactly one full block a specified number of rounds.336 * Only used in the Intermediate Value Known Answer Test.337 *338 * Returns:339 * TRUE - on success340 * BAD_CIPHER_STATE - cipher in bad state (e.g., not initialized)341 */342 int cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,343 RIJ_BYTE *input, int inputLen, RIJ_BYTE *outBuffer, int rounds) {344 int j;345 word8 block[4][4];346 347 if (cipher == NULL || key == NULL) {348 return BAD_CIPHER_STATE;349 }350 351 for (j = 3; j >= 0; j--) {352 /* parse input stream into rectangular array */353 *((word32*)block[j]) = *((word32*)(input+4*j));354 }355 356 switch (key->direction) {357 case DIR_ENCRYPT:358 rijndaelEncryptRound(block, key->keySched, key->ROUNDS, rounds);359 break;360 361 case DIR_DECRYPT:362 rijndaelDecryptRound(block, key->keySched, key->ROUNDS, rounds);363 break;364 365 default:366 return BAD_KEY_DIR;367 }368 369 for (j = 3; j >= 0; j--) {370 /* parse rectangular array into output ciphertext bytes */371 *((word32*)(outBuffer+4*j)) = *((word32*)block[j]);372 }373 374 return TRUE;375 }376 #endif /* INTERMEDIATE_VALUE_KAT */377 #endif -
trunk/src/samhain.c
r473 r481 71 71 #include "sh_readconf.h" 72 72 #include "sh_hash.h" 73 #include "sh_dbIO.h" 73 74 #include "sh_restrict.h" 74 75 … … 78 79 #include "sh_gpg.h" 79 80 #include "sh_mem.h" 80 #include "sh_ forward.h"81 #include "sh_xfer.h" 81 82 #include "sh_tools.h" 82 83 #include "sh_hash.h" … … 88 89 #include "sh_ignore.h" 89 90 #include "sh_prelink.h" 91 #include "sh_sem.h" 90 92 #endif 91 93 … … 120 122 volatile int sig_termfast; /* SIGTERM */ 121 123 volatile int sig_force_check; /* SIGTTOU */ 124 volatile int sh_load_delta_flag; 122 125 long int eintr__result; 123 126 char sh_sig_msg[SH_MINIBUF]; … … 313 316 ErrFlag[0] |= (1 << 11); 314 317 #endif 318 319 sh.delayload = 0; 320 315 321 #ifdef MKA_13 316 322 ErrFlag[0] |= (1 << 12); … … 337 343 sig_termfast = 0; /* SIGTERM */ 338 344 sig_force_check = 0; /* SIGTTOU */ 345 sh_load_delta_flag = 0; 339 346 strcpy ( sh_sig_msg, _("None")); 340 347 … … 373 380 374 381 sh.pid = (UINT64) getpid(); 382 383 sh.outpath = NULL; 375 384 376 385 /* The flags. … … 647 656 { 648 657 649 skey->mlock_failed = S L_FALSE;658 skey->mlock_failed = S_FALSE; 650 659 skey->rngI = BAD; 651 660 /* properly initialized later … … 718 727 #endif 719 728 720 SL_ENTER(_("exit_handler"));721 722 729 #if defined(SH_WITH_SERVER) 723 730 sh_socket_remove (); … … 751 758 */ 752 759 sh_html_zero(); 753 /* sh_forward_html_write(); */754 760 #endif 755 761 … … 775 781 #endif 776 782 #if defined(SH_WITH_SERVER) 777 sh_ forward_free_all ();783 sh_xfer_free_all (); 778 784 #endif 779 785 #if defined(SH_WITH_MAIL) … … 796 802 /* --- Exit Message. --- 797 803 */ 804 if (sh.flag.exit == EXIT_FAILURE && !strcmp(sh_sig_msg, _("None"))) 805 sl_strlcpy(sh_sig_msg, _("exit_failure"), SH_MINIBUF); 806 if (sh.flag.exit == EXIT_SUCCESS && !strcmp(sh_sig_msg, _("None"))) 807 sl_strlcpy(sh_sig_msg, _("exit_success"), SH_MINIBUF); 798 808 sh_error_handle ((-1), FIL__, __LINE__, sh.flag.exit, MSG_EXIT_NORMAL, 799 809 sh.prg_name, sh_sig_msg); … … 805 815 /* --- Restrict error logging to stderr. --- 806 816 */ 807 #ifdef WITH_MESSAGE_QUEUE808 817 close_ipc (); 809 #endif810 818 sh_error_only_stderr (S_TRUE); 811 812 819 813 820 /* --- Remove lock, delete critical information. --- … … 1215 1222 } 1216 1223 1224 1225 void do_reconf() 1226 { 1227 int status, modnum; 1228 1229 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_RECONF); 1230 1231 sh_thread_pause_flag = S_TRUE; 1232 1233 #if defined(WITH_EXTERNAL) 1234 /* delete list of external tasks 1235 */ 1236 (void) sh_ext_cleanup(); 1237 #endif 1238 #if defined(SH_WITH_MAIL) 1239 sh_nmail_free(); 1240 #endif 1241 1242 /* delete the file list, make all database 1243 * entries visible (allignore = FALSE) 1244 */ 1245 (void) sh_files_deldirstack (); 1246 (void) sh_files_delfilestack (); 1247 (void) sh_files_delglobstack (); 1248 (void) sh_ignore_clean (); 1249 (void) hash_full_tree (); 1250 sh_audit_delete_all (); 1251 1252 1253 #if defined(SH_WITH_CLIENT) 1254 reset_count_dev_server(); 1255 #endif 1256 #if defined(SH_WITH_CLIENT) || defined(SH_STANDALONE) 1257 sh_restrict_purge (); 1258 1259 1260 FileSchedOne = free_sched(FileSchedOne); 1261 FileSchedTwo = free_sched(FileSchedTwo); 1262 1263 for (modnum = 0; modList[modnum].name != NULL; ++modnum) 1264 { 1265 /* sh_thread_pause_flag is true, and we block in lock 1266 * until check has returned, so we are sure check will 1267 * not run until sh_thread_pause_flag is set to false 1268 */ 1269 /* if (modList[modnum].initval >= SH_MOD_ACTIVE) */ 1270 (void) modList[modnum].mod_reconf(); 1271 } 1272 #endif 1273 1274 reset_count_dev_console(); 1275 reset_count_dev_time(); 1276 1277 (void) sh_unix_maskreset(); 1278 1279 #ifdef RELOAD_DATABASE 1280 sh_hash_hashdelete(); 1281 1282 if (0 != sl_strcmp(file_path('D', 'R'), _("REQ_FROM_SERVER"))) 1283 { 1284 char hashbuf[KEYBUF_SIZE]; 1285 (void) sl_strlcpy(sh.data.hash, 1286 sh_tiger_hash (file_path('D', 'R'), 1287 TIGER_FILE, TIGER_NOLIM, 1288 hashbuf, sizeof(hashbuf)), 1289 KEY_LEN+1); 1290 } 1291 #endif 1292 (void) sl_trust_purge_user(); 1293 (void) sh_files_hle_reg (NULL); 1294 (void) sh_prelink_run (NULL, NULL, 0, 0); 1295 1296 /* -------------------------- 1297 * --- READ CONFIGURATION --- 1298 * -------------------------- 1299 */ 1300 (void) sh_readconf_read (); 1301 sig_config_read_again = 0; 1302 (void) sh_files_setrec(); 1303 (void) sh_files_test_setup(); 1304 sh_audit_commit (); 1305 1306 if (0 != sh.flag.nice) 1307 { 1308 #ifdef HAVE_SETPRIORITY 1309 setpriority(PRIO_PROCESS, 0, sh.flag.nice); 1310 #else 1311 nice(sh.flag.nice); 1312 #endif 1313 } 1314 1315 if (sh.flag.checkSum == SH_CHECK_INIT) 1316 { 1317 sh.flag.isdaemon = S_FALSE; 1318 sh.flag.loop = S_FALSE; 1319 } 1320 1321 1322 /* --- Initialize modules. --- 1323 */ 1324 TPT((0, FIL__, __LINE__, _("msg=<Initialize modules.>\n"))); 1325 for (modnum = 0; modList[modnum].name != NULL; ++modnum) 1326 { 1327 status = modList[modnum].mod_init(&(modList[modnum])); 1328 1329 if (status < 0) 1330 { 1331 if (status == (-1)) { 1332 sh_error_handle (SH_ERR_NOTICE, FIL__, __LINE__, 1333 status, MSG_MOD_FAIL, 1334 _(modList[modnum].name), 1335 status+SH_MOD_OFFSET); 1336 } else { 1337 sh_error_handle ((-1), FIL__, __LINE__, 1338 status, MSG_MOD_FAIL, 1339 _(modList[modnum].name), 1340 status+SH_MOD_OFFSET); 1341 } 1342 modList[modnum].initval = SH_MOD_FAILED; 1343 } 1344 else 1345 { 1346 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_MOD_OK, 1347 _(modList[modnum].name)); 1348 modList[modnum].initval = status; 1349 } 1350 } 1351 1352 /* module is properly set up now 1353 */ 1354 sh_thread_pause_flag = S_FALSE; 1355 1356 return; 1357 } 1358 1359 static void check_signals (volatile int *flag_check_1, 1360 volatile int * flag_check_2) 1361 { 1362 if (sig_raised > 0) 1363 { 1364 1365 TPT((0, FIL__, __LINE__, _("msg=<Process a signal.>\n"))) 1366 1367 if (sig_termfast == 1) /* SIGTERM */ 1368 { 1369 TPT((0, FIL__, __LINE__, _("msg=<Terminate.>\n"))); 1370 --sig_raised; --sig_urgent; 1371 aud_exit (FIL__, __LINE__, EXIT_SUCCESS); 1372 } 1373 1374 if (sig_force_check == 1) /* SIGTTOU */ 1375 { 1376 TPT((0, FIL__, __LINE__, _("msg=<Check run triggered.>\n"))); 1377 *flag_check_1 = 1; *flag_check_2 = 1; 1378 sig_force_check = 0; --sig_raised; 1379 sh_sem_trylock(); 1380 } 1381 1382 if (sig_config_read_again == 1 && /* SIGHUP */ 1383 sh_global_suspend_flag == 0) 1384 { 1385 TPT((0, FIL__, __LINE__, _("msg=<Re-read configuration.>\n"))); 1386 do_reconf(); 1387 --sig_raised; 1388 } 1389 1390 if (sig_fresh_trail == 1) /* SIGIOT */ 1391 { 1392 if (sh_global_suspend_flag == 0) 1393 { 1394 SH_MUTEX_LOCK(mutex_thread_nolog); 1395 1396 /* Logfile access 1397 */ 1398 #ifdef SH_USE_XML 1399 (void) sh_log_file (NULL, NULL); 1400 #endif 1401 TPT((0, FIL__, __LINE__, _("msg=<Logfile stop/restart.>\n"))); 1402 sh_error_only_stderr (S_TRUE); 1403 (void) sh_unix_rm_lock_file(sh.srvlog.name); 1404 (void) retry_msleep(3, 0); 1405 sh.flag.log_start = S_TRUE; 1406 sh_error_only_stderr (S_FALSE); 1407 sh_thread_pause_flag = S_FALSE; 1408 sig_fresh_trail = 0; 1409 --sig_raised; 1410 SH_MUTEX_UNLOCK(mutex_thread_nolog); 1411 } 1412 } 1413 1414 if (sig_terminate == 1) /* SIGQUIT */ 1415 { 1416 TPT((0, FIL__, __LINE__, _("msg=<Terminate.>\n"))); 1417 strncpy (sh_sig_msg, _("Quit"), 20); 1418 --sig_raised; 1419 aud_exit (FIL__, __LINE__, EXIT_SUCCESS); 1420 } 1421 1422 if (sig_debug_switch == 1) /* SIGUSR1 */ 1423 { 1424 TPT((0, FIL__, __LINE__, _("msg=<Debug switch.>\n"))); 1425 sh_error_dbg_switch(); 1426 sig_debug_switch = 0; 1427 --sig_raised; 1428 } 1429 1430 if (sig_suspend_switch > 0) /* SIGUSR2 */ 1431 { 1432 TPT((0, FIL__, __LINE__, _("msg=<Suspend switch.>\n"))); 1433 if (sh_global_suspend_flag != 1) { 1434 SH_MUTEX_LOCK_UNSAFE(mutex_thread_nolog); 1435 sh_global_suspend_flag = 1; 1436 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_SUSPEND, 1437 sh.prg_name); 1438 } else { 1439 sh_global_suspend_flag = 0; 1440 SH_MUTEX_UNLOCK_UNSAFE(mutex_thread_nolog); 1441 } 1442 --sig_suspend_switch; 1443 --sig_raised; --sig_urgent; 1444 } 1445 1446 if (sh_load_delta_flag > 0 && 1447 sh_global_suspend_flag == 0) /* DELTA Command */ 1448 { 1449 if (0 == sh_dbIO_load_delta()) 1450 { 1451 --sh_load_delta_flag; --sig_raised; 1452 } 1453 } 1454 1455 sig_raised = (sig_raised < 0) ? 0 : sig_raised; 1456 sig_urgent = (sig_urgent < 0) ? 0 : sig_urgent; 1457 TPT((0, FIL__, __LINE__, _("msg=<End signal processing.>\n"))); 1458 } 1459 return; 1460 } 1461 1462 void check_for_delta_db() 1463 { 1464 /* Need to contact the server. 1465 */ 1466 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_CHECK_2); 1467 1468 if (sig_raised > 0 && sh_load_delta_flag > 0) /* DELTA Command */ 1469 { 1470 /* There was a DELTA Command 1471 */ 1472 if (0 == sh_dbIO_load_delta()) 1473 { 1474 --sh_load_delta_flag; --sig_raised; 1475 } 1476 } 1477 return; 1478 } 1479 1217 1480 #endif 1218 1481 … … 1229 1492 { 1230 1493 #if defined(INET_SYSLOG) 1231 extern int create_syslog_socket (int flag);1494 extern int sh_xfer_create_syslog_socket (int flag); 1232 1495 #endif 1233 1496 #if defined(SH_WITH_SERVER) … … 1272 1535 /* --- Close all but first three file descriptors. --- 1273 1536 */ 1274 sh_unix_closeall(3, -1, S L_FALSE); /* at program start */1537 sh_unix_closeall(3, -1, S_FALSE); /* at program start */ 1275 1538 1276 1539 … … 1535 1798 /* --- load database; checksum of database 1536 1799 */ 1537 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 1538 TPT((0, FIL__, __LINE__, _("msg=<Get checksum of the database.>\n"))) 1539 if (sh.flag.checkSum == SH_CHECK_CHECK) 1540 { 1541 if (0 != sl_strcmp(file_path('D', 'R'), _("REQ_FROM_SERVER"))) 1542 { 1543 char hashbuf[KEYBUF_SIZE]; 1544 (void) sl_strlcpy(sh.data.hash, 1545 sh_tiger_hash (file_path('D', 'R'), 1546 TIGER_FILE, TIGER_NOLIM, 1547 hashbuf, sizeof(hashbuf)), 1548 KEY_LEN+1); 1549 } 1550 1551 /* this eventually fetches the file from server to get checksum 1552 */ 1553 sh_hash_init (); 1554 } 1800 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 1801 if (0 == sh.delayload) 1802 sh_hash_init_and_checksum(); 1555 1803 #endif 1556 1804 … … 1564 1812 } 1565 1813 1814 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 1815 if (sh.delayload) 1816 { 1817 sleep(sh.delayload); 1818 sh_hash_init_and_checksum(); 1819 } 1820 #endif 1821 1566 1822 /* --- drop privileges eventually --- 1567 1823 */ … … 1569 1825 sh_create_tcp_socket (); 1570 1826 #if defined(INET_SYSLOG) 1571 create_syslog_socket (S_TRUE);1827 sh_xfer_create_syslog_socket (S_TRUE); 1572 1828 #endif 1573 1829 SL_REQUIRE(sl_policy_get_real(DEFAULT_IDENT) == SL_ENONE, … … 1591 1847 */ 1592 1848 #if defined(INET_SYSLOG) && defined(SH_WITH_SERVER) 1593 create_syslog_socket (S_FALSE);1849 sh_xfer_create_syslog_socket (S_FALSE); 1594 1850 #endif 1595 1851 … … 1656 1912 1657 1913 1658 if ((skey == NULL) || (skey->mlock_failed == S L_TRUE))1914 if ((skey == NULL) || (skey->mlock_failed == S_TRUE)) 1659 1915 sh_error_handle ((-1), FIL__, __LINE__, EPERM, MSG_MLOCK); 1660 1916 … … 1678 1934 if (sh.flag.isserver == S_TRUE) 1679 1935 { 1680 sh_ receive();1936 sh_xfer_start_server(); 1681 1937 TPT((0, FIL__, __LINE__, _("msg=<End server.>\n"))) 1682 1938 aud_exit (FIL__, __LINE__, EXIT_SUCCESS); 1683 1939 } 1684 1940 #else 1685 sh_ receive();1941 sh_xfer_start_server(); 1686 1942 TPT((0, FIL__, __LINE__, _("msg=<End server.>\n"))) 1687 1943 aud_exit (FIL__, __LINE__, EXIT_SUCCESS); … … 1745 2001 } 1746 2002 2003 /* -------- CREATE SEMAPHORE --------- 2004 */ 2005 sh_sem_open(); 2006 1747 2007 /* -------- MAIN LOOP --------- 1748 2008 */ … … 1763 2023 tcurrent = time (NULL); 1764 2024 1765 if (sig_raised > 0) 1766 { 1767 1768 TPT((0, FIL__, __LINE__, _("msg=<Process a signal.>\n"))) 1769 1770 if (sig_termfast == 1) /* SIGTERM */ 1771 { 1772 TPT((0, FIL__, __LINE__, _("msg=<Terminate.>\n"))); 1773 /* strncpy (sh_sig_msg, _("SIGTERM"), 20); */ 1774 --sig_raised; --sig_urgent; 1775 aud_exit (FIL__, __LINE__, EXIT_SUCCESS); 1776 } 1777 1778 if (sig_force_check == 1) /* SIGTTOU */ 1779 { 1780 TPT((0, FIL__, __LINE__, _("msg=<Check run triggered.>\n"))); 1781 flag_check_1 = 1; 1782 flag_check_2 = 1; 1783 sig_force_check = 0; 1784 --sig_raised; 1785 } 1786 1787 if (sig_config_read_again == 1 && /* SIGHUP */ 1788 sh_global_suspend_flag == 0) 1789 { 1790 TPT((0, FIL__, __LINE__, _("msg=<Re-read configuration.>\n"))) 1791 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_RECONF); 1792 1793 sh_thread_pause_flag = S_TRUE; 1794 1795 #if defined(WITH_EXTERNAL) 1796 /* delete list of external tasks 1797 */ 1798 (void) sh_ext_cleanup(); 1799 #endif 1800 #if defined(SH_WITH_MAIL) 1801 sh_nmail_free(); 1802 #endif 1803 1804 /* delete the file list, make all database 1805 * entries visible (allignore = FALSE) 1806 */ 1807 (void) sh_files_deldirstack (); 1808 (void) sh_files_delfilestack (); 1809 (void) sh_files_delglobstack (); 1810 (void) sh_ignore_clean (); 1811 (void) hash_full_tree (); 1812 sh_audit_delete_all (); 1813 1814 1815 #if defined(SH_WITH_CLIENT) 1816 reset_count_dev_server(); 1817 #endif 1818 #if defined(SH_WITH_CLIENT) || defined(SH_STANDALONE) 1819 sh_restrict_purge (); 1820 1821 1822 FileSchedOne = free_sched(FileSchedOne); 1823 FileSchedTwo = free_sched(FileSchedTwo); 1824 1825 for (modnum = 0; modList[modnum].name != NULL; ++modnum) 1826 { 1827 /* sh_thread_pause_flag is true, and we block in lock 1828 * until check has returned, so we are sure check will 1829 * not run until sh_thread_pause_flag is set to false 1830 */ 1831 /* if (modList[modnum].initval >= SH_MOD_ACTIVE) */ 1832 (void) modList[modnum].mod_reconf(); 1833 } 1834 #endif 1835 1836 reset_count_dev_console(); 1837 reset_count_dev_time(); 1838 1839 (void) sh_unix_maskreset(); 1840 1841 /* Should this be included ??? 1842 * (i.e. should we reload the database ?) 1843 */ 1844 #ifdef RELOAD_DATABASE 1845 sh_hash_hashdelete(); 1846 1847 if (0 != sl_strcmp(file_path('D', 'R'), _("REQ_FROM_SERVER"))) 1848 { 1849 char hashbuf[KEYBUF_SIZE]; 1850 (void) sl_strlcpy(sh.data.hash, 1851 sh_tiger_hash (file_path('D', 'R'), 1852 TIGER_FILE, TIGER_NOLIM, 1853 hashbuf, sizeof(hashbuf)), 1854 KEY_LEN+1); 1855 } 1856 #endif 1857 (void) sl_trust_purge_user(); 1858 (void) sh_files_hle_reg (NULL); 1859 (void) sh_prelink_run (NULL, NULL, 0); 1860 1861 /* -------------------------- 1862 * --- READ CONFIGURATION --- 1863 * -------------------------- 1864 */ 1865 (void) sh_readconf_read (); 1866 sig_config_read_again = 0; 1867 (void) sh_files_setrec(); 1868 (void) sh_files_test_setup(); 1869 sh_audit_commit (); 1870 1871 if (0 != sh.flag.nice) 1872 { 1873 #ifdef HAVE_SETPRIORITY 1874 setpriority(PRIO_PROCESS, 0, sh.flag.nice); 1875 #else 1876 nice(sh.flag.nice); 1877 #endif 1878 } 1879 1880 if (sh.flag.checkSum == SH_CHECK_INIT) 1881 { 1882 sh.flag.isdaemon = S_FALSE; 1883 sh.flag.loop = S_FALSE; 1884 } 1885 1886 1887 /* --- Initialize modules. --- 1888 */ 1889 TPT((0, FIL__, __LINE__, _("msg=<Initialize modules.>\n"))); 1890 for (modnum = 0; modList[modnum].name != NULL; ++modnum) 1891 { 1892 status = modList[modnum].mod_init(&(modList[modnum])); 1893 1894 if (status < 0) 1895 { 1896 if (status == (-1)) { 1897 sh_error_handle (SH_ERR_NOTICE, FIL__, __LINE__, 1898 status, MSG_MOD_FAIL, 1899 _(modList[modnum].name), 1900 status+SH_MOD_OFFSET); 1901 } else { 1902 sh_error_handle ((-1), FIL__, __LINE__, 1903 status, MSG_MOD_FAIL, 1904 _(modList[modnum].name), 1905 status+SH_MOD_OFFSET); 1906 } 1907 modList[modnum].initval = SH_MOD_FAILED; 1908 } 1909 else 1910 { 1911 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_MOD_OK, 1912 _(modList[modnum].name)); 1913 modList[modnum].initval = status; 1914 } 1915 } 1916 1917 /* module is properly set up now 1918 */ 1919 sh_thread_pause_flag = S_FALSE; 1920 1921 --sig_raised; 1922 } 1923 1924 if (sig_fresh_trail == 1) /* SIGIOT */ 1925 { 1926 if (sh_global_suspend_flag == 0) 1927 { 1928 SH_MUTEX_LOCK(mutex_thread_nolog); 1929 1930 /* Logfile access 1931 */ 1932 #ifdef SH_USE_XML 1933 (void) sh_log_file (NULL, NULL); 1934 #endif 1935 TPT((0, FIL__, __LINE__, _("msg=<Logfile stop/restart.>\n"))); 1936 sh_error_only_stderr (S_TRUE); 1937 (void) sh_unix_rm_lock_file(sh.srvlog.name); 1938 (void) retry_msleep(3, 0); 1939 sh.flag.log_start = S_TRUE; 1940 sh_error_only_stderr (S_FALSE); 1941 sh_thread_pause_flag = S_FALSE; 1942 sig_fresh_trail = 0; 1943 --sig_raised; 1944 SH_MUTEX_UNLOCK(mutex_thread_nolog); 1945 } 1946 } 1947 1948 if (sig_terminate == 1) /* SIGQUIT */ 1949 { 1950 TPT((0, FIL__, __LINE__, _("msg=<Terminate.>\n"))); 1951 strncpy (sh_sig_msg, _("Quit"), 20); 1952 --sig_raised; --sig_urgent; 1953 aud_exit (FIL__, __LINE__, EXIT_SUCCESS); 1954 } 1955 1956 if (sig_debug_switch == 1) /* SIGUSR1 */ 1957 { 1958 TPT((0, FIL__, __LINE__, _("msg=<Debug switch.>\n"))); 1959 sh_error_dbg_switch(); 1960 sig_debug_switch = 0; 1961 --sig_raised; 1962 } 1963 1964 if (sig_suspend_switch > 0) /* SIGUSR2 */ 1965 { 1966 TPT((0, FIL__, __LINE__, _("msg=<Suspend switch.>\n"))); 1967 if (sh_global_suspend_flag != 1) { 1968 SH_MUTEX_LOCK_UNSAFE(mutex_thread_nolog); 1969 sh_global_suspend_flag = 1; 1970 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_SUSPEND, 1971 sh.prg_name); 1972 } else { 1973 sh_global_suspend_flag = 0; 1974 SH_MUTEX_UNLOCK_UNSAFE(mutex_thread_nolog); 1975 } 1976 --sig_suspend_switch; 1977 --sig_raised; --sig_urgent; 1978 } 1979 sig_raised = (sig_raised < 0) ? 0 : sig_raised; 1980 sig_urgent = (sig_urgent < 0) ? 0 : sig_urgent; 1981 TPT((0, FIL__, __LINE__, _("msg=<End signal processing.>\n"))); 1982 } 1983 1984 if (sh_global_suspend_flag == 1) 1985 { 2025 do { 2026 check_signals(&flag_check_1, &flag_check_2); 2027 if (sh_global_suspend_flag == 1) 1986 2028 (void) retry_msleep (1, 0); 1987 continue; 1988 } 2029 } while (sh_global_suspend_flag == 1); 1989 2030 1990 2031 /* see whether its time to check files … … 2026 2067 (flag_check_1 == 1 || flag_check_2 == 1)) 2027 2068 { 2069 sh_sem_trylock(); 2070 2071 /* Starting a check now, so make sure to fetch delta DB 2072 * if there is one to download. 2073 */ 2074 check_for_delta_db(); 2075 2028 2076 SH_INOTIFY_IFUSED( sh.flag.inotify |= SH_INOTIFY_INSCAN; ); 2029 2077 /* Refresh list files matching glob patterns. … … 2065 2113 (void) sh_files_chk (); 2066 2114 2067 if (sig_urgent > 0) 2068 continue; 2069 2115 if (sig_urgent > 0) { sh_sem_unlock(sh.statistics.files_report); continue; } 2070 2116 /* 2071 2117 * check for files not visited … … 2077 2123 } 2078 2124 2079 if (sig_urgent > 0) 2080 continue; 2125 if (sig_urgent > 0) { sh_sem_unlock(sh.statistics.files_report); continue; } 2081 2126 2082 2127 /* reset … … 2084 2129 TPT((0, FIL__, __LINE__, _("msg=<Reset status.>\n"))) 2085 2130 sh_dirs_reset (); 2086 if (sig_urgent > 0) 2087 continue;2131 2132 if (sig_urgent > 0) { sh_sem_unlock(sh.statistics.files_report); continue; } 2088 2133 2089 2134 sh_files_reset (); 2135 check_done = 1; 2136 2090 2137 flag_check_1 = 0; 2091 2138 flag_check_2 = 0; 2092 check_done = 1; 2139 sh_sem_unlock(sh.statistics.files_report); 2140 2093 2141 SH_INOTIFY_IFUSED( sh.flag.inotify &= ~SH_INOTIFY_INSCAN; ); 2094 2142 SH_INOTIFY_IFUSED( sh.flag.inotify &= ~SH_INOTIFY_DOSCAN; ); 2095 2143 2096 (void) sh_prelink_run (NULL, NULL, 0); 2097 2098 if (sig_urgent > 0) 2099 continue; 2144 (void) sh_prelink_run (NULL, NULL, 0, 0); 2145 2146 if (sig_urgent > 0) continue; 2100 2147 2101 2148 runtim = time(NULL) - sh.statistics.time_start; … … 2130 2177 sh.fileCheck.alarm_last = time (NULL); 2131 2178 2132 if (sig_urgent > 0) 2133 continue; 2179 if (sig_urgent > 0) continue; 2134 2180 2135 2181 /* … … 2142 2188 } 2143 2189 2144 if (sig_urgent > 0) 2145 continue; 2190 if (sig_urgent > 0) continue; 2146 2191 2147 2192 /* execute modules … … 2161 2206 */ 2162 2207 if (sh.flag.checkSum == SH_CHECK_INIT) 2163 sh_ hash_pushdata(NULL, NULL);2208 sh_dbIO_data_write (NULL, NULL); 2164 2209 2165 2210 /* write out database … … 2168 2213 sh.flag.update == S_TRUE && 2169 2214 check_done == 1) 2170 sh_ hash_writeout();2215 sh_dbIO_writeout_update (); 2171 2216 2172 2217 /* no-op unless MEM_LOG is defined in sh_mem.c … … 2196 2241 /* no loop if not daemon 2197 2242 */ 2198 if (sh.flag.isdaemon != S_TRUE && sh.flag.loop == S_FALSE) 2199 break; 2200 if (sig_urgent > 0) 2201 continue; 2243 if (sh.flag.isdaemon != S_TRUE && sh.flag.loop == S_FALSE) break; 2244 if (sig_urgent > 0) continue; 2202 2245 2203 2246 /* see whether its time to send mail … … 2211 2254 } 2212 2255 #endif 2213 if (sig_urgent > 0) 2214 continue; 2256 if (sig_urgent > 0) continue; 2215 2257 2216 2258 /* log the timestamp … … 2232 2274 (void) taus_seed(); 2233 2275 2234 if (sig_urgent > 0) 2235 continue; 2276 if (sig_urgent > 0) continue; 2236 2277 2237 2278 /* reset cache … … 2266 2307 #endif 2267 2308 2268 #if 02269 {2270 char command[128];2271 sprintf(command, "/bin/cat /proc/%d/status", (int) getpid());2272 system(command); /* flawfinder: ignore *//* debug code */2273 malloc_stats();2274 }2275 #endif2276 2277 2309 aud_exit (FIL__, __LINE__, EXIT_SUCCESS); 2278 2310 SL_RETURN(0, _("main")); -
trunk/src/sh_calls.c
r473 r481 262 262 errno = error; 263 263 264 if (flag_err_debug == S L_TRUE)264 if (flag_err_debug == S_TRUE) 265 265 { 266 266 char ipbuf[SH_IP_BUF]; … … 291 291 sh_ipvx_save(serv_addr, ss.ss_family, (struct sockaddr *) &ss); 292 292 293 if (flag_err_debug == S L_TRUE)293 if (flag_err_debug == S_TRUE) 294 294 { 295 295 char ipbuf[SH_IP_BUF]; … … 490 490 #endif 491 491 492 SL_ENTER(_("retry_msleep"));493 494 492 errno = 0; 495 493 if (millisec > 999) millisec = 999; … … 511 509 #else 512 510 if (sec > 0) 513 { 514 sleep (sec); /* nanosleep not available */ 515 } 516 else 517 { 511 sleep (sec); /* nanosleep not available */ 512 else { 518 513 #ifdef HAVE_USLEEP 519 if (millisec > 0) 520 { 521 usleep(1000 * millisec); 522 } 514 if (millisec > 0) 515 usleep(1000 * millisec); 523 516 #else 524 if (millisec > 0) 525 { 526 sleep (1); 527 } 528 #endif 529 } 530 #endif 531 SL_RETURN(result, _("retry_msleep")); 517 if (millisec > 0) 518 sleep (1); 519 #endif 520 } 521 #endif 522 return result; 532 523 } 533 524 … … 835 826 836 827 /*@noreturn@*/ 837 void aud_exit (const char * file, int line, int fd)828 void aud_exit (const char * file, int line, int exitval) 838 829 { 839 830 if (sh.flag.audit != 0 && (sh.flag.aud_mask & AUD_EXIT) != 0) 840 831 sh_error_handle ((-1), file, line, 0, MSG_AUD_EXIT, 841 (long) fd);832 (long) exitval); 842 833 843 834 SL_ENTER(_("aud_exit")); 844 835 845 sh.flag.exit = fd;846 exit( fd);836 sh.flag.exit = exitval; 837 exit(exitval); 847 838 } 848 839 849 840 /*@noreturn@*/ 850 void aud__exit (const char * file, int line, int fd)841 void aud__exit (const char * file, int line, int exitval) 851 842 { 852 843 if (sh.flag.audit != 0 && (sh.flag.aud_mask & AUD_EXIT) != 0) 853 844 sh_error_handle ((-1), file, line, 0, MSG_AUD_EXIT, 854 (long) fd);845 (long) exitval); 855 846 856 847 SL_ENTER(_("aud__exit")); 857 848 858 sh.flag.exit = fd;859 _exit( fd);849 sh.flag.exit = exitval; 850 _exit(exitval); 860 851 } 861 852 -
trunk/src/sh_cat.c
r403 r481 70 70 { MSG_CHECK_0, SH_ERR_WARN, RUN, N_("msg=\"No files or directories defined for checking\"")}, 71 71 { MSG_CHECK_1, SH_ERR_STAMP, STAMP, N_("msg=\"File check completed.\" time=\"%ld\" kBps=\"%f\"")}, 72 { MSG_CHECK_2, SH_ERR_STAMP, STAMP, N_("msg=\"File check starting.\"")}, 72 73 { MSG_STAMP, SH_ERR_STAMP, STAMP, N_("msg=\"---- TIMESTAMP ----\"")}, 73 74 … … 75 76 { MSG_D_DSTART, SH_ERR_INFO, RUN, N_("msg=\"Downloading database file\"")}, 76 77 { MSG_D_FAIL, SH_ERR_INFO, RUN, N_("msg=\"No file from server, trying local file\"")}, 78 { MSG_D_DELTAOK, SH_ERR_SEVERE, RUN, N_("msg=\"Delta database downloaded\", path=\"%s\"")}, 79 { MSG_D_DELTAFAIL, SH_ERR_SEVERE, RUN, N_("msg=\"Delta database download failed\", path=\"%s\"")}, 77 80 78 81 … … 93 96 { MSG_SUID_QREPORT,SH_ERR_SEVERE, EVENT, N_("msg=\"Quarantine report: %s\" path=\"%s\"") }, 94 97 { MSG_SUID_ERROR, SH_ERR_SEVERE, EVENT, N_("msg=\"Quarantine error: %s\"") }, 95 #endif96 97 #ifdef SH_USE_KERN98 /* FreeBSD */99 { MSG_KERN_POLICY, SH_ERR_SEVERE, EVENT, N_("msg=\"POLICY [Kernel] BSD syscall table: new: %#lx old: %#lx\" syscall=\"%03d %s\"") },100 { MSG_KERN_POL_CO, SH_ERR_SEVERE, EVENT, N_("msg=\"POLICY [Kernel] BSD syscall code: new: %#x,%#x old: %#x,%#x\" syscall=\"%03d %s\"") },101 102 /* Linux */103 { MSG_KERN_SYSCALL,SH_ERR_SEVERE, EVENT, N_("msg=\"POLICY [Kernel] SYSCALL modified syscall\" syscall=\"%03d %s\" %s") },104 { MSG_KERN_PROC, SH_ERR_SEVERE, EVENT, N_("msg=\"POLICY [Kernel] PROC modified proc filesystem: %s\"") },105 { MSG_KERN_IDT, SH_ERR_SEVERE, EVENT, N_("msg=\"POLICY [Kernel] IDT modified interrupt %03d: new: 0x%-8.8lx %-9s %3d %c old: 0x%-8.8lx %-9s %3d %c\" %s") },106 { MSG_KERN_GATE, SH_ERR_SEVERE, EVENT, N_("msg=\"POLICY [Kernel] SYS_GATE modified system_call: new: %#x,%#x old: %#x,%#x\" syscall=\"%03d %s\" %s") },107 108 98 #endif 109 99 … … 411 401 { MSG_CHECK_0, SH_ERR_WARN, RUN, N_("msg=<No files or directories defined for checking>")}, 412 402 { MSG_CHECK_1, SH_ERR_STAMP, STAMP, N_("msg=<File check completed.>, time=<%ld>, kBps=<%f>")}, 403 { MSG_CHECK_2, SH_ERR_STAMP, STAMP, N_("msg=<File check starting.>")}, 413 404 { MSG_STAMP, SH_ERR_STAMP, STAMP, N_("msg=<---- TIMESTAMP ---->")}, 414 405 … … 416 407 { MSG_D_DSTART, SH_ERR_INFO, RUN, N_("msg=<Downloading database file>")}, 417 408 { MSG_D_FAIL, SH_ERR_INFO, RUN, N_("msg=<No file from server, trying local file>")}, 409 { MSG_D_DELTAOK, SH_ERR_SEVERE, RUN, N_("msg=<Delta database downloaded>, path=<%s>")}, 410 { MSG_D_DELTAFAIL, SH_ERR_SEVERE, RUN, N_("msg=<Delta database download failed>, path=<%s>")}, 418 411 419 412 -
trunk/src/sh_database.c
r454 r481 180 180 { NULL, N_("link_old"), 0, 49, MAX_PATH_STORE+1, 0, offsetof(struct dbins_, link_old)}, 181 181 { NULL, N_("link_new"), 0, 50, MAX_PATH_STORE+1, 0, offsetof(struct dbins_, link_new)}, 182 182 183 /* These go into dbins.ulong_data[n - START_SEC_LONGS] */ 183 184 { NULL, N_("size_old"), 0, 51, 0, 0, 0 }, 184 185 { NULL, N_("size_new"), 0, 52, 0, 0, 0 }, … … 201 202 { NULL, N_("port"), 0, 67, 0, 0, 0 }, 202 203 { NULL, N_("return_code"), 0, 68, 0, 0, 0 }, 203 /* { NULL, N_("userid"), 0, 69, 0, 0 }, old 'userid', 1.8.1 */ 204 205 { NULL, N_("host"), 0, 70, 64, 0, offsetof(struct dbins_, fromhost)}, 206 { NULL, N_("attr_old"), 0, 71, 16, 0, offsetof(struct dbins_, attr_old)}, 207 { NULL, N_("attr_new"), 0, 72, 16, 0, offsetof(struct dbins_, attr_new)}, 208 { NULL, N_("acl_old"), 0, 73, 1024, 0, offsetof(struct dbins_, acl_old)}, 209 { NULL, N_("acl_new"), 0, 74, 1024, 0, offsetof(struct dbins_, acl_new)}, 204 205 { NULL, N_("checkflags_old"), 0, 69, 0, 0, 0 }, 206 { NULL, N_("checkflags_new"), 0, 70, 0, 0, 0 }, 207 208 /* END_SEC_LONGS */ 209 210 { NULL, N_("host"), 0, 71, 64, 0, offsetof(struct dbins_, fromhost)}, 211 { NULL, N_("attr_old"), 0, 72, 16, 0, offsetof(struct dbins_, attr_old)}, 212 { NULL, N_("attr_new"), 0, 73, 16, 0, offsetof(struct dbins_, attr_new)}, 213 { NULL, N_("acl_old"), 0, 74, 1024, 0, offsetof(struct dbins_, acl_old)}, 214 { NULL, N_("acl_new"), 0, 75, 1024, 0, offsetof(struct dbins_, acl_new)}, 210 215 211 216 { NULL, NULL, 0, 0, 0, 0, 0 } 212 217 }; 213 218 214 #define SH_SLOT_HOST 70 219 #define SH_SLOT_CHECKFLAGS 69 220 221 /* need special attention b/o reserved SQL words */ 222 #define SH_SLOT_HOST 71 215 223 #define SH_SLOT_GROUP 7 224 225 /* these go into dbins.ulong_data[n-START_SEC_LONGS */ 216 226 #define START_SEC_LONGS 51 217 #define END_SEC_LONGS 68227 #define END_SEC_LONGS 70 218 228 219 229 #if defined(HAVE_INT_32) … … 1163 1173 } 1164 1174 1165 if (flag_err_debug == S L_TRUE)1175 if (flag_err_debug == S_TRUE) 1166 1176 { 1167 1177 p = mysql_info (db_conn); … … 1360 1370 while (attr_tab[i].attr != NULL) 1361 1371 { 1372 if (SH_SLOT_CHECKFLAGS == attr_tab[i].val) { 1373 if (db_entry->ulong_data[attr_tab[i].val-START_SEC_LONGS] == 0 && 1374 db_entry->ulong_data[attr_tab[i+1].val-START_SEC_LONGS] == 0) 1375 { i+= 2; continue; } 1376 } 1377 1362 1378 if (attr_tab[i].size != 0) 1363 1379 { … … 1728 1744 (size_t) res->size); 1729 1745 } 1730 else if (res->val >= START_SEC_LONGS )1746 else if (res->val >= START_SEC_LONGS && res->val <= END_SEC_LONGS) 1731 1747 { 1732 1748 db_entry->ulong_data[res->val-START_SEC_LONGS] 1733 = strtoul(&p[j+2], (char **) NULL, 10); 1734 /* atol(&p[j+2]); */ 1749 = strtoul(&p[j+2], (char **) NULL, 0); 1735 1750 } 1736 1751 -
trunk/src/sh_entropy.c
r473 r481 300 300 { 301 301 m_count = sl_read_timeout_fd(fd2, nbuf, nbytes, 302 timeout_val, S L_FALSE);302 timeout_val, S_FALSE); 303 303 if (m_count < 0) 304 304 m_count = 0; … … 337 337 338 338 #ifdef NAME_OF_DEV_URANDOM 339 m_count = read_mbytes ( 1, NAME_OF_DEV_RANDOM, nbuf, nbytes);339 m_count = read_mbytes ( 10, NAME_OF_DEV_URANDOM, nbuf, nbytes); 340 340 #else 341 m_count = read_mbytes (300, NAME_OF_DEV_RANDOM, nbuf, nbytes);341 m_count = read_mbytes (300, NAME_OF_DEV_RANDOM, nbuf, nbytes); 342 342 #endif 343 343 … … 346 346 #ifdef NAME_OF_DEV_URANDOM 347 347 sh_error_handle (SH_ERR_NOTICE, FIL__, __LINE__, EIO, MSG_NODEV, 348 (long) sh.real.uid, NAME_OF_DEV_ RANDOM);348 (long) sh.real.uid, NAME_OF_DEV_URANDOM); 349 349 #else 350 350 sh_error_handle ((-1), FIL__, __LINE__, EIO, MSG_NODEV, … … 353 353 } 354 354 355 #ifdef NAME_OF_DEV_ URANDOM355 #ifdef NAME_OF_DEV_RANDOM 356 356 if (m_count < nbytes) 357 357 { 358 i = read_mbytes(30 , NAME_OF_DEV_URANDOM, &nbuf[m_count], nbytes-m_count);358 i = read_mbytes(300, NAME_OF_DEV_RANDOM, &nbuf[m_count], nbytes-m_count); 359 359 if (i == 0) 360 360 sh_error_handle ((-1), FIL__, __LINE__, EIO, MSG_NODEV, 361 (long) sh.real.uid, NAME_OF_DEV_ URANDOM);361 (long) sh.real.uid, NAME_OF_DEV_RANDOM); 362 362 else 363 363 m_count += i; … … 601 601 /* don't leak file descriptors 602 602 */ 603 sh_unix_closeall (3, -1, S L_TRUE); /* in child process */603 sh_unix_closeall (3, -1, S_TRUE); /* in child process */ 604 604 605 605 /* zero priv info … … 942 942 } 943 943 944 #ifdef HAVE_GETTIMEOFDAY 945 { 946 unsigned short tseed[3]; 947 948 gettimeofday(&tv, 0); 949 tseed[0] = tv.tv_sec & 0xFFFF; 950 tseed[1] = tv.tv_usec & 0xFFFF; 951 tseed[2] = (tv.tv_sec ^ tv.tv_usec) >> 16; 952 keybuf = (char *) sh_tiger_hash_uint32 ((char *) tseed, 953 TIGER_DATA, sizeof(tseed), 954 kbuf, KEY_BYT/sizeof(UINT32)); 955 memset(addbuf, '\0', sizeof(addbuf)); 956 for (i = 0; i < KEY_BYT; ++i) 957 { 958 addbuf[i] = keybuf[i]; 959 addbuf[i+KEY_BYT] = skey->poolv[i]; 960 } 961 SH_MUTEX_LOCK_UNSAFE(mutex_skey); 962 for (i = 0; i < KEY_BYT; ++i) 963 skey->poolv[i] ^= keybuf[i]; 964 SH_MUTEX_UNLOCK_UNSAFE(mutex_skey); 965 } 966 #endif 967 944 968 if (bufcount > 0) 945 969 { … … 1002 1026 char bufy[9 * sizeof(UINT32) + 1]; 1003 1027 int status; 1004 1005 memset(skey->poolv, '\0', KEY_BYT); 1006 1007 status = sh_entropy (24, bufx); 1008 CuAssertTrue(tc, 0 == status); 1009 1010 memset(skey->poolv, '\0', KEY_BYT); 1011 1012 status = sh_entropy (24, bufy); 1013 CuAssertTrue(tc, 0 == status); 1014 1015 CuAssertTrue(tc, 0 != memcmp(bufx, bufy, 24)); 1028 int count; 1029 1030 for (count = 0; count < 20; ++count) 1031 { 1032 memset(skey->poolv, '\0', KEY_BYT); 1033 skey->poolc = 0; 1034 1035 status = sh_entropy (24, bufx); 1036 CuAssertTrue(tc, 0 == status); 1037 1038 memset(skey->poolv, '\0', KEY_BYT); 1039 skey->poolc = 0; 1040 1041 status = sh_entropy (24, bufy); 1042 CuAssertTrue(tc, 0 == status); 1043 1044 CuAssertTrue(tc, 0 != memcmp(bufx, bufy, 24)); 1045 } 1016 1046 } 1017 1047 #endif -
trunk/src/sh_err_console.c
r474 r481 25 25 #include "sh_error.h" 26 26 #include "sh_utils.h" 27 #include "sh_sem.h" 27 28 28 29 #undef FIL__ … … 36 37 37 38 extern int OnlyStderr; 38 39 39 40 40 #if !defined(O_NONBLOCK) … … 53 53 #include <sys/msg.h> 54 54 55 #if !defined(EIDRM) 56 #define EIDRM (EINVAL) 57 #endif 58 55 59 struct sh_msgbuf { 56 60 long mtype; … … 66 70 /* Open the SysV message queue, creating it when neccesary 67 71 */ 68 static int open_ ipc(void)72 static int open_queue(void) 69 73 { 70 74 key_t key; 71 75 #if defined(WITH_TPT) 72 int error = 0;73 76 char errbuf[SH_ERRBUF_SIZE]; 74 77 #endif 75 78 76 SL_ENTER(_("open_ ipc"));79 SL_ENTER(_("open_queue")); 77 80 78 81 /* get key 79 82 */ 80 key = ftok ("/tmp", '#'); 83 key = ftok (DEFAULT_DATAROOT, '#'); 84 81 85 if (key == (key_t) -1) 82 86 { 83 #if defined(WITH_TPT)84 error = errno;85 #endif86 87 TPT(( 0, FIL__, __LINE__, _("msg=<ftok: %s> errno=<%d>\n"), 87 sh_error_message(err or, errbuf, sizeof(errbuf)), error));88 SL_RETURN(-1, _("open_ ipc"));88 sh_error_message(errno, errbuf, sizeof(errbuf)), errno)); 89 SL_RETURN(-1, _("open_queue")); 89 90 } 90 91 … … 95 96 if (msgid < 0) 96 97 { 97 #if defined(WITH_TPT)98 error = errno;99 #endif100 98 TPT(( 0, FIL__, __LINE__, _("msg=<msgget: %s> errno=<%d>\n"), 101 sh_error_message(err or, errbuf, sizeof(errbuf)), error));102 SL_RETURN(-1, _("open_ ipc"));103 } 104 105 SL_RETURN(0, _("open_ ipc"));106 } 107 108 /* Close the SysV message queue 99 sh_error_message(errno, errbuf, sizeof(errbuf)), errno)); 100 SL_RETURN(-1, _("open_queue")); 101 } 102 103 SL_RETURN(0, _("open_queue")); 104 } 105 106 /* Close the SysV message queue and/or semaphore 109 107 */ 110 108 void close_ipc (void) 111 109 { 112 SL_ENTER(_("close_ipc"));113 114 110 if (msgid != (-1)) 115 111 (void) msgctl (msgid, IPC_RMID, NULL); 116 SL_RET0(_("close_ipc")); 112 sh_sem_close(); 113 return; 117 114 } 118 115 … … 128 125 } 129 126 130 /* #define MY_MAX_MSG 254 */131 127 #define MY_MAX_MSG 1022 128 129 static void remove_message() 130 { 131 int rc; 132 struct { 133 long mtype; /* Message type. */ 134 char mtext[128]; /* Message text. */ 135 } recv_msg; 136 137 recv_msg.mtype = 1; 138 do { 139 rc = msgrcv(msgid, &recv_msg, sizeof(recv_msg.mtext), 1, 140 MSG_NOERROR|IPC_NOWAIT); 141 } while (rc < 0 && errno == EINTR); 142 143 memset(&recv_msg, '\0', sizeof(recv_msg)); 144 return; 145 } 132 146 133 147 static int push_message_queue (const char * msg) … … 138 152 int count = 0; 139 153 #if defined(WITH_TPT) 140 int error = 0;141 154 char errbuf[SH_ERRBUF_SIZE]; 142 155 #endif … … 153 166 { 154 167 TPT(( 0, FIL__, __LINE__, _("msg=<msg_queue not open>\n"))); 155 status = open_ ipc();168 status = open_queue(); 156 169 } 157 170 158 171 if (status < 0) 159 172 { 160 TPT(( 0, FIL__, __LINE__, _("msg=<open_ ipc() failed>\n")));173 TPT(( 0, FIL__, __LINE__, _("msg=<open_queue() failed>\n"))); 161 174 SL_RETURN(-1, _("push_message_queue")); 162 175 } … … 165 178 * long mtype; 166 179 * char mtext[1]; <-- sizeof(mtext) will be 1+MY_MAX_MSG 167 * } 168 */ 180 * } */ 181 169 182 recv_msg = (struct sh_msgbuf*) SH_ALLOC(sizeof(struct sh_msgbuf)+MY_MAX_MSG); 170 183 recv_msg->mtype = 1; … … 177 190 if (count > 1) 178 191 { 192 memset(recv_msg, '\0', MY_MAX_MSG+1); 179 193 SH_FREE(recv_msg); 180 194 SL_RETURN(-1, _("push_message_queue")); 181 195 } 182 196 183 /* send the message 184 */ 185 do { 186 errno = 0; 197 do { errno = 0; 187 198 rc = msgsnd(msgid, recv_msg, strlen(recv_msg->mtext)+1, IPC_NOWAIT); 188 } 189 while (rc < 0 && errno == EINTR); 199 200 if (rc == -1 && errno == EAGAIN) 201 remove_message(); 202 } while (rc < 0 && (errno == EINTR && errno == EAGAIN)); 190 203 191 204 if (rc == -1 && errno != EAGAIN) 192 205 { 193 /* EIDRM is not in OpenBSD 194 */ 195 if (errno == EINVAL 196 #if defined(EIDRM) 197 || errno == EIDRM 198 #endif 199 ) 200 { 201 TPT(( 0, FIL__, __LINE__, _("msg=<msg_queue not open>\n"))); 202 status = open_ipc(); 203 if (status == 0) 204 { 205 ++count; 206 goto send_it; 207 } 208 } 209 else 210 { 211 #if defined(WITH_TPT) 212 error = errno; 213 #endif 214 TPT(( 0, FIL__, __LINE__, _("msg=<msgsnd: %s> errno=<%d>\n"), 215 sh_error_message(error, errbuf, sizeof(errbuf)), error)); 216 SH_FREE(recv_msg); 217 SL_RETURN(-1, _("push_message_queue")); 218 } 219 } 220 206 /* EIDRM is not in OpenBSD */ 207 if (errno == EINVAL || errno == EIDRM) { 208 TPT(( 0, FIL__, __LINE__, _("msg=<msg_queue not open>\n"))); 209 status = open_queue(); 210 if (status == 0) { 211 ++count; 212 goto send_it; } 213 } else { 214 TPT(( 0, FIL__, __LINE__, _("msg=<msgsnd: %s> errno=<%d>\n"), 215 sh_error_message(errno, errbuf, sizeof(errbuf)), errno)); 216 memset(recv_msg, '\0', MY_MAX_MSG+1); 217 SH_FREE(recv_msg); 218 SL_RETURN(-1, _("push_message_queue")); 219 } 220 } 221 222 memset(recv_msg, '\0', MY_MAX_MSG+1); 221 223 SH_FREE(recv_msg); 224 222 225 SL_RETURN(0, _("push_message_queue")); 223 226 } … … 234 237 #endif 235 238 239 #else /* no message queue */ 240 241 void close_ipc() { sh_sem_close(); return; } 242 236 243 #endif 237 244 … … 283 290 static int service_failure[2] = { 0, 0}; 284 291 int fd[2] = { -1, -1}; 285 int sflags;286 292 int cc; 287 293 size_t len; … … 331 337 { 332 338 fd[0] = open ( sh.srvcons.name, O_WRONLY|O_APPEND|O_NOCTTY|O_NONBLOCK); 333 if (fd[0] >= 0) {334 sflags = (int) retry_fcntl(FIL__, __LINE__, fd[0], F_GETFL, 0);335 if (sflags >= 0)336 {337 (void) retry_fcntl(FIL__, __LINE__, fd[0],338 F_SETFL, sflags & ~O_NONBLOCK);339 }340 }341 339 342 340 if (sh.srvcons.alt[0] != '\0') 343 341 { 344 342 fd[1] = open (sh.srvcons.alt, O_WRONLY|O_APPEND|O_NOCTTY|O_NONBLOCK); 345 if (fd[1] >= 0) { 346 sflags = (int) retry_fcntl(FIL__, __LINE__, fd[1], F_GETFL, 0); 347 if (sflags >= 0) 348 { 349 (void) retry_fcntl(FIL__, __LINE__, fd[1], 350 F_SETFL, sflags & ~O_NONBLOCK); 351 } 352 ccMax = 2; 353 } 343 ccMax = 2; 354 344 } 355 345 -
trunk/src/sh_err_log.c
r459 r481 770 770 771 771 #if defined(HAVE_MLOCK) && !defined(HAVE_BROKEN_MLOCK) 772 if (skey->mlock_failed == S L_FALSE)772 if (skey->mlock_failed == S_FALSE) 773 773 { 774 774 if ( (-1) == sh_unix_mlock( FIL__, __LINE__, log_msg.msg, 775 775 (size_t)(2*KEY_LEN + status + 32) ) ) 776 776 { 777 skey->mlock_failed = S L_TRUE;777 skey->mlock_failed = S_TRUE; 778 778 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 779 779 sh_error_handle ((-1), FIL__, __LINE__, EPERM, MSG_MLOCK); … … 782 782 } 783 783 #else 784 if (skey->mlock_failed == S L_FALSE)785 { 786 skey->mlock_failed = S L_TRUE;784 if (skey->mlock_failed == S_FALSE) 785 { 786 skey->mlock_failed = S_TRUE; 787 787 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 788 788 sh_error_handle ((-1), FIL__, __LINE__, EPERM, MSG_MLOCK); … … 1207 1207 int i; 1208 1208 1209 if (S L_TRUE == sl_ok_adds (gSave[0], sh.statistics.bytes_hashed))1209 if (S_TRUE == sl_ok_adds (gSave[0], sh.statistics.bytes_hashed)) 1210 1210 gSave[0] += sh.statistics.bytes_hashed; 1211 if (S L_TRUE == sl_ok_adds (gSave[1], sh.statistics.dirs_checked))1211 if (S_TRUE == sl_ok_adds (gSave[1], sh.statistics.dirs_checked)) 1212 1212 gSave[1] += sh.statistics.dirs_checked; 1213 if (S L_TRUE == sl_ok_adds (gSave[2], sh.statistics.files_checked))1213 if (S_TRUE == sl_ok_adds (gSave[2], sh.statistics.files_checked)) 1214 1214 gSave[2] += sh.statistics.files_checked; 1215 if (S L_TRUE == sl_ok_adds (gSave[3], sh.statistics.files_report))1215 if (S_TRUE == sl_ok_adds (gSave[3], sh.statistics.files_report)) 1216 1216 gSave[3] += sh.statistics.files_report; 1217 if (S L_TRUE == sl_ok_adds (gSave[4], sh.statistics.files_error))1217 if (S_TRUE == sl_ok_adds (gSave[4], sh.statistics.files_error)) 1218 1218 gSave[4] += sh.statistics.files_error; 1219 if (S L_TRUE == sl_ok_adds (gSave[5], sh.statistics.files_nodir))1219 if (S_TRUE == sl_ok_adds (gSave[5], sh.statistics.files_nodir)) 1220 1220 gSave[5] += sh.statistics.files_nodir; 1221 1221 -
trunk/src/sh_error.c
r476 r481 60 60 #include "sh_tiger.h" 61 61 #include "sh_nmail.h" 62 #include "sh_ forward.h"62 #include "sh_xfer.h" 63 63 #include "sh_prelude.h" 64 64 #include "sh_pthread.h" … … 77 77 extern int clt_class; 78 78 79 int flag_err_debug = S L_FALSE;80 int flag_err_info = S L_FALSE;79 int flag_err_debug = S_FALSE; 80 int flag_err_info = S_FALSE; 81 81 82 82 int ShDFLevel[SH_ERR_T_END]; … … 100 100 static int sh_error_init (void); 101 101 102 /*@owned@*//*@null@*/inline103 static c har * get_format(unsigned long msg_id, /*@out@*/int * priority,104 /*@out@*/unsigned int * class);102 inline 103 static const char * get_format(unsigned long msg_id, int * priority, 104 unsigned int * class); 105 105 106 106 static int sh_error_string (struct _log_t * lmsg, va_list vl); … … 177 177 { 178 178 if ((errFlags.loglevel & SH_ERR_ALL) != 0) 179 flag_err_debug = S L_TRUE;179 flag_err_debug = S_TRUE; 180 180 else if ((errFlags.printlevel & SH_ERR_ALL) != 0) 181 flag_err_debug = S L_TRUE;181 flag_err_debug = S_TRUE; 182 182 else if ((errFlags.maillevel & SH_ERR_ALL) != 0) 183 flag_err_debug = S L_TRUE;183 flag_err_debug = S_TRUE; 184 184 else if ((errFlags.exportlevel & SH_ERR_ALL) != 0) 185 flag_err_debug = S L_TRUE;185 flag_err_debug = S_TRUE; 186 186 else if ((errFlags.sysloglevel & SH_ERR_ALL) != 0) 187 flag_err_debug = S L_TRUE;187 flag_err_debug = S_TRUE; 188 188 else if ((errFlags.externallevel & SH_ERR_ALL) != 0) 189 flag_err_debug = S L_TRUE;189 flag_err_debug = S_TRUE; 190 190 else if ((errFlags.databaselevel & SH_ERR_ALL) != 0) 191 flag_err_debug = S L_TRUE;191 flag_err_debug = S_TRUE; 192 192 else if ((errFlags.preludelevel & SH_ERR_ALL) != 0) 193 flag_err_debug = S L_TRUE;193 flag_err_debug = S_TRUE; 194 194 else 195 flag_err_debug = S L_FALSE;195 flag_err_debug = S_FALSE; 196 196 return; 197 197 } … … 201 201 { 202 202 if ((errFlags.loglevel & SH_ERR_INFO) != 0) 203 flag_err_info = S L_TRUE;203 flag_err_info = S_TRUE; 204 204 else if ((errFlags.printlevel & SH_ERR_INFO) != 0) 205 flag_err_info = S L_TRUE;205 flag_err_info = S_TRUE; 206 206 else if ((errFlags.maillevel & SH_ERR_INFO) != 0) 207 flag_err_info = S L_TRUE;207 flag_err_info = S_TRUE; 208 208 else if ((errFlags.exportlevel & SH_ERR_INFO) != 0) 209 flag_err_info = S L_TRUE;209 flag_err_info = S_TRUE; 210 210 else if ((errFlags.sysloglevel & SH_ERR_INFO) != 0) 211 flag_err_info = S L_TRUE;211 flag_err_info = S_TRUE; 212 212 else if ((errFlags.externallevel & SH_ERR_INFO) != 0) 213 flag_err_info = S L_TRUE;213 flag_err_info = S_TRUE; 214 214 else if ((errFlags.databaselevel & SH_ERR_INFO) != 0) 215 flag_err_info = S L_TRUE;215 flag_err_info = S_TRUE; 216 216 else if ((errFlags.preludelevel & SH_ERR_INFO) != 0) 217 flag_err_info = S L_TRUE;217 flag_err_info = S_TRUE; 218 218 else 219 flag_err_info = S L_FALSE;219 flag_err_info = S_FALSE; 220 220 return; 221 221 } … … 230 230 SH_ERR_SEVERE | SH_ERR_FATAL); 231 231 dbg_flag = 1; 232 flag_err_debug = S L_TRUE;232 flag_err_debug = S_TRUE; 233 233 } 234 234 else { … … 935 935 int severity; 936 936 unsigned int class; 937 c har * fmt;937 const char * fmt; 938 938 volatile int sev = sev1; /* Avoids the 'clobbered by longjmp' warning. */ 939 939 … … 1286 1286 sl_snprintf(ex_msg, ex_len, _("%d?%u?%s"), 1287 1287 severity, class, lmsg->msg); 1288 retval = sh_ forward(ex_msg);1288 retval = sh_xfer_report (ex_msg); 1289 1289 SH_FREE(ex_msg); 1290 1290 export_block = 0; … … 1438 1438 int severity; 1439 1439 unsigned int class; 1440 c har * fmt;1440 const char * fmt; 1441 1441 int retval; 1442 1442 … … 1517 1517 */ 1518 1518 /*@owned@*/ /*@null@*/inline 1519 static c har * get_format(unsigned long msg_id, /*@out@*/ int * priority,1519 static const char * get_format(unsigned long msg_id, /*@out@*/ int * priority, 1520 1520 /*@out@*/unsigned int * class) 1521 1521 { … … 1532 1532 *priority = (int) msg_cat[i].priority; 1533 1533 *class = (unsigned int) msg_cat[i].class; 1534 SL_RETURN (((c har *) _(msg_cat[i].format)), _("get_format"));1534 SL_RETURN (((const char *) _(msg_cat[i].format)), _("get_format")); 1535 1535 } 1536 1536 ++i; … … 1573 1573 SL_RETURN( 0, _("sh_error_ehead")); 1574 1574 } 1575 1576 #if !defined(VA_COPY) 1577 #if defined(__GNUC__) && defined(__PPC__) && (defined(_CALL_SYSV) || defined(_WIN32)) 1578 #define VA_COPY(ap1, ap2) (*(ap1) = *(ap2)) 1579 #elif defined(VA_COPY_AS_ARRAY) 1580 #define VA_COPY(ap1, ap2) memmove ((ap1), (ap2), sizeof (va_list)) 1581 #else /* va_list is a pointer */ 1582 #define VA_COPY(ap1, ap2) ((ap1) = (ap2)) 1583 #endif 1584 #endif 1575 1585 1576 1586 … … 1707 1717 else 1708 1718 { 1709 /* use va_copy*/1710 /*@i@*/ va_copy(vl2, vl);1719 /* use VA_COPY */ 1720 /*@i@*/VA_COPY(vl2, vl); 1711 1721 len = sl_strlen(lmsg->msg); 1712 1722 /*@i@*/required = sl_vsnprintf(&(lmsg->msg[len]), … … 1769 1779 SH_ERR_STAMP | SH_ERR_ERR | SH_ERR_SEVERE | 1770 1780 SH_ERR_FATAL); 1771 flag_err_info = S L_TRUE;1781 flag_err_info = S_TRUE; 1772 1782 #endif 1773 1783 -
trunk/src/sh_extern.c
r440 r481 305 305 */ 306 306 #if !defined(PDGBFILE) 307 sh_unix_closeall (3, task->com_fd, S L_TRUE); /* in child process */307 sh_unix_closeall (3, task->com_fd, S_TRUE); /* in child process */ 308 308 #endif 309 309 … … 423 423 char str1[128]; 424 424 int ival = pfd; 425 int n = 0;426 int m = 0;425 unsigned int n = 0; 426 unsigned int m = 0; 427 427 428 428 if (ival < 0) ival = -ival; … … 633 633 { 634 634 task->exit_status = WEXITSTATUS(task->exit_status); 635 if ((flag_err_debug == S L_TRUE) || (task->exit_status != 0))635 if ((flag_err_debug == S_TRUE) || (task->exit_status != 0)) 636 636 sl_snprintf(infomsg, sizeof(infomsg), 637 637 _("Subprocess exited normally with status %d"), … … 687 687 /*@+bufferoverflowhigh@*/ 688 688 status = task->exit_status; 689 if (flag_err_debug == S L_TRUE)689 if (flag_err_debug == S_TRUE) 690 690 { 691 691 sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, task->exit_status, … … 867 867 } 868 868 869 int sh_ext_popen_init (sh_tas_t * task, c har * command, char * argv0, ...)869 int sh_ext_popen_init (sh_tas_t * task, const char * command, char * argv0, ...) 870 870 { 871 871 va_list vl; … … 956 956 * ifconfig | grep -1 lo | tail -n 1 | sed s/.*inet addr:\([0-9.]*\)\(.*\)/\1/ 957 957 */ 958 char * sh_ext_popen_str (c har * command)958 char * sh_ext_popen_str (const char * command) 959 959 { 960 960 sh_tas_t task; -
trunk/src/sh_fInotify.c
r433 r481 35 35 #include "sh_unix.h" 36 36 #include "sh_hash.h" 37 #include "sh_dbIO.h" 37 38 #include "sh_files.h" 38 39 #include "sh_ignore.h" … … 111 112 static int sh_fInotify_process(struct inotify_event * event); 112 113 static int sh_fInotify_report(struct inotify_event * event, char * filename, 113 int class, unsigned long check_ mask, int ftype, int rdepth);114 int class, unsigned long check_flags, int ftype, int rdepth); 114 115 115 116 int sh_fInotify_init(struct mod_type * arg) … … 236 237 count2 = 0; /* Update baseline database. */ 237 238 if (sh.flag.checkSum == SH_CHECK_CHECK && sh.flag.update == S_TRUE) 238 sh_ hash_writeout();239 sh_dbIO_writeout_update (); 239 240 } 240 241 … … 329 330 int type; 330 331 int rdepth; 331 unsigned long check_ mask;332 unsigned long check_flags; 332 333 int retval; 333 334 int errnum; … … 349 350 350 351 while (NULL != (filename = sh_inotify_pop_dormant(&sh_file_watches, 351 &class, &check_ mask,352 &class, &check_flags, 352 353 &type, &rdepth))) 353 354 { 354 355 retval = sh_inotify_add_watch(filename, &sh_file_watches, &errnum, 355 class, check_ mask, type, rdepth);356 class, check_flags, type, rdepth); 356 357 357 358 if (retval < 0) … … 424 425 if (event->mask & IN_UNMOUNT) sl_strlcat(dbgbuf, "IN_UNMOUNT ", sizeof(dbgbuf)); 425 426 426 /* fprintf(stderr, "FIXME: %s\n", dbgbuf); */427 428 427 SH_MUTEX_LOCK(mutex_thread_nolog); 429 428 sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, 0, MSG_E_SUBGEN, … … 437 436 int ftype; 438 437 int rdepth; 439 unsigned long check_ mask;438 unsigned long check_flags; 440 439 char * filename; 441 440 extern int flag_err_debug; 442 441 443 if (flag_err_debug == S L_TRUE)442 if (flag_err_debug == S_TRUE) 444 443 { 445 444 sh_fInotify_logmask(event); … … 449 448 { 450 449 filename = sh_inotify_search_item(&sh_file_watches, event->wd, 451 &class, &check_ mask, &ftype, &rdepth);450 &class, &check_flags, &ftype, &rdepth); 452 451 453 452 if (filename) 454 453 { 455 sh_fInotify_report(event, filename, class, check_ mask, ftype, rdepth);454 sh_fInotify_report(event, filename, class, check_flags, ftype, rdepth); 456 455 SH_FREE(filename); 457 456 } … … 488 487 } 489 488 490 void sh_fInotify_report_add(char * path, int class, unsigned long check_ mask)489 void sh_fInotify_report_add(char * path, int class, unsigned long check_flags) 491 490 { 492 491 if (S_FALSE == sh_ignore_chk_new(path)) … … 496 495 sh_files_clear_file_reported(path); 497 496 498 sh_files_search_file(path, &class, &check_ mask, &reported);497 sh_files_search_file(path, &class, &check_flags, &reported); 499 498 500 sh_files_filecheck (class, check_ mask, path, NULL,499 sh_files_filecheck (class, check_flags, path, NULL, 501 500 &reported, 0); 502 501 if (SH_FFLAG_REPORTED_SET(reported)) … … 521 520 static int sh_fInotify_report_change (struct inotify_event * event, 522 521 char * path, char * filename, 523 int class, unsigned long check_ mask, int ftype)522 int class, unsigned long check_flags, int ftype) 524 523 { 525 524 int reported; … … 529 528 if (S_FALSE == sh_ignore_chk_mod(path)) 530 529 { 531 ret = sh_files_search_file(path, &class, &check_ mask, &reported);530 ret = sh_files_search_file(path, &class, &check_flags, &reported); 532 531 533 532 if ((ret == 0) && (event->len > 0) && (ftype == SH_INOTIFY_FILE)) … … 537 536 else 538 537 { 539 sh_files_filecheck (class, check_ mask, filename,538 sh_files_filecheck (class, check_flags, filename, 540 539 (event->len > 0) ? event->name : NULL, 541 540 &reported, 0); … … 548 547 static int sh_fInotify_report_missing (struct inotify_event * event, 549 548 char * path, 550 int class, unsigned long check_ mask, int ftype)549 int class, unsigned long check_flags, int ftype) 551 550 { 552 551 int reported; … … 560 559 if (0 != hashreport_missing(path, level)) 561 560 { 562 int ret = sh_files_search_file(path, &class, &check_ mask, &reported);561 int ret = sh_files_search_file(path, &class, &check_flags, &reported); 563 562 564 563 if ((ret == 0) && (event->len > 0) && (ftype == SH_INOTIFY_FILE)) … … 578 577 } 579 578 580 #ifndef REPLACE_OLD581 sh_hash_set_visited_true(path);582 #else583 579 sh_hash_set_missing(path); 584 #endif 580 585 581 if (sh.flag.reportonce == S_TRUE) 586 582 sh_files_set_file_reported(path); … … 596 592 static int sh_fInotify_report_added (struct inotify_event * event, 597 593 char * path, char * filename, 598 int class, unsigned long check_ mask,594 int class, unsigned long check_flags, 599 595 int ftype, int rdepth) 600 596 { … … 608 604 sh_files_clear_file_reported(path); 609 605 610 ret = sh_files_search_file(path, &class, &check_ mask, &reported);606 ret = sh_files_search_file(path, &class, &check_flags, &reported); 611 607 612 608 if ((ret == 0) && (event->len > 0) && (ftype == SH_INOTIFY_FILE)) … … 618 614 int classD = class; 619 615 int reportedD = reported; 620 unsigned long check_ maskD = check_mask;616 unsigned long check_flagsD = check_flags; 621 617 622 618 if (event->mask & IN_ISDIR) 623 619 { 624 retD = sh_files_search_dir(path, &classD, &check_ maskD,620 retD = sh_files_search_dir(path, &classD, &check_flagsD, 625 621 &reportedD, &rdepthD); 626 622 if (retD != 0) … … 629 625 { 630 626 class = classD; 631 check_ mask = check_maskD;627 check_flags = check_flagsD; 632 628 } 633 629 } 634 630 } 635 631 636 sh_files_filecheck (class, check_ mask, filename,632 sh_files_filecheck (class, check_flags, filename, 637 633 (event->len > 0) ? event->name : NULL, 638 634 &reported, 0); … … 641 637 { 642 638 SH_INOTIFY_IFUSED( sh.flag.inotify |= SH_INOTIFY_INSCAN; ); 643 sh_files_checkdir (classD, check_ maskD, rdepthD,639 sh_files_checkdir (classD, check_flagsD, rdepthD, 644 640 path, (event->len > 0) ? event->name : NULL); 645 641 SH_INOTIFY_IFUSED( sh.flag.inotify &= ~SH_INOTIFY_INSCAN; ); … … 657 653 { 658 654 sh_inotify_add_watch(path, &sh_file_watches, &ret, 659 class, check_ mask,655 class, check_flags, 660 656 (event->mask & IN_ISDIR)?SH_INOTIFY_DIR:SH_INOTIFY_FILE, 661 657 rdepthD); … … 666 662 667 663 static int sh_fInotify_report(struct inotify_event * event, char * filename, 668 int class, unsigned long check_ mask, int ftype, int rdepth)664 int class, unsigned long check_flags, int ftype, int rdepth) 669 665 { 670 666 char * fullpath = NULL; … … 684 680 { 685 681 sh_fInotify_report_change (event, path, filename, 686 class, check_ mask, ftype);682 class, check_flags, ftype); 687 683 } 688 684 else if ((event->mask & (IN_DELETE|IN_DELETE_SELF|IN_MOVE_SELF|IN_MOVED_FROM)) != 0) 689 685 { 690 686 sh_fInotify_report_missing (event, path, 691 class, check_ mask, ftype);687 class, check_flags, ftype); 692 688 } 693 689 else if((event->mask & (IN_CREATE|IN_MOVED_TO)) != 0) 694 690 { 695 691 sh_fInotify_report_added (event, path, filename, 696 class, check_ mask,692 class, check_flags, 697 693 ftype, rdepth); 698 694 } -
trunk/src/sh_fifo.c
r272 r481 180 180 memset(getit->data, 0, len); 181 181 if (NULL != sl_strstr (getit->data, _("LOGKEY"))) 182 { 183 MUNLOCK(getit->data, (len+1)); 184 ; 185 } 182 MUNLOCK(getit->data, (len+1)); 186 183 if (getit->s_xtra) 187 184 SH_FREE(getit->s_xtra); … … 197 194 /* push an item on the head of the list 198 195 */ 199 int push_list (SH_FIFO * fifo, c har * indat, int in_i, const char * in_str)196 int push_list (SH_FIFO * fifo, const char * indat, int in_i, const char * in_str) 200 197 { 201 198 struct dlist * item; … … 224 221 225 222 if (NULL != sl_strstr (indat, _("LOGKEY"))) 226 { 227 MLOCK(item->data, (len+1)); 228 ; 229 } 223 MLOCK(item->data, (len+1)); 230 224 231 225 sl_strlcpy (item->data, indat, len+1); … … 260 254 /* push an item on the tail of the list 261 255 */ 262 int push_tail_list (SH_FIFO * fifo, c har * indat, int in_i, const char * in_str)256 int push_tail_list (SH_FIFO * fifo, const char * indat, int in_i, const char * in_str) 263 257 { 264 258 struct dlist * item; … … 287 281 288 282 if (NULL != sl_strstr (indat, _("LOGKEY"))) 289 { 290 MLOCK(item->data, (len+1)); 291 ; 292 } 283 MLOCK(item->data, (len+1)); 293 284 294 285 sl_strlcpy (item->data, indat, len+1); … … 318 309 ++(fifo->fifo_cts); 319 310 320 SL_RETURN(( 0), _("push_tail_list"));311 SL_RETURN((fifo->fifo_cts), _("push_tail_list")); 321 312 } 322 313 … … 356 347 357 348 if (NULL != sl_strstr (retval, _("LOGKEY"))) 358 { 359 MUNLOCK(getit->data, (len+1)); 360 ; 361 } 349 MUNLOCK(getit->data, (len+1)); 362 350 363 351 if (getit->s_xtra) … … 372 360 373 361 374 375 362 #ifdef SH_CUTEST 363 #include "CuTest.h" 364 365 void Test_fifo (CuTest *tc) { 366 367 SH_FIFO ff; 368 int ret; 369 char * p; 370 371 fifo_init(&ff); 372 373 p = sh_fifo_pop(&ff); 374 CuAssertPtrEquals(tc, NULL, p); 375 376 /* first sequence */ 377 ret = sh_fifo_push(&ff, "one"); 378 CuAssertIntEquals(tc,1,ret); 379 ret = sh_fifo_push(&ff, "two"); 380 CuAssertIntEquals(tc,2,ret); 381 ret = sh_fifo_push(&ff, "three"); 382 CuAssertIntEquals(tc,3,ret); 383 384 p = sh_fifo_pop(&ff); 385 CuAssertPtrNotNull(tc, p); 386 CuAssertStrEquals(tc,"one", p); 387 p = sh_fifo_pop(&ff); 388 CuAssertPtrNotNull(tc, p); 389 CuAssertStrEquals(tc,"two", p); 390 p = sh_fifo_pop(&ff); 391 CuAssertPtrNotNull(tc, p); 392 CuAssertStrEquals(tc,"three", p); 393 p = sh_fifo_pop(&ff); 394 CuAssertPtrEquals(tc, NULL, p); 395 396 /* second sequence */ 397 ret = sh_fifo_push(&ff, "one"); 398 CuAssertIntEquals(tc,1,ret); 399 p = sh_fifo_pop(&ff); 400 CuAssertPtrNotNull(tc, p); 401 CuAssertStrEquals(tc,"one", p); 402 ret = sh_fifo_push_tail(&ff, "one"); 403 CuAssertIntEquals(tc,1,ret); 404 p = sh_fifo_pop(&ff); 405 CuAssertPtrNotNull(tc, p); 406 CuAssertStrEquals(tc,"one", p); 407 p = sh_fifo_pop(&ff); 408 CuAssertPtrEquals(tc, NULL, p); 409 410 /* third sequence */ 411 ret = sh_fifo_push(&ff, "one"); 412 CuAssertIntEquals(tc,1,ret); 413 ret = sh_fifo_push(&ff, "two"); 414 CuAssertIntEquals(tc,2,ret); 415 ret = sh_fifo_push(&ff, "three"); 416 CuAssertIntEquals(tc,3,ret); 417 418 p = sh_fifo_pop(&ff); 419 CuAssertPtrNotNull(tc, p); 420 CuAssertStrEquals(tc,"one", p); 421 ret = sh_fifo_push_tail(&ff, p); 422 CuAssertIntEquals(tc,3,ret); 423 424 p = sh_fifo_pop(&ff); 425 CuAssertPtrNotNull(tc, p); 426 CuAssertStrEquals(tc,"one", p); 427 p = sh_fifo_pop(&ff); 428 CuAssertPtrNotNull(tc, p); 429 CuAssertStrEquals(tc,"two", p); 430 p = sh_fifo_pop(&ff); 431 CuAssertPtrNotNull(tc, p); 432 CuAssertStrEquals(tc,"three", p); 433 p = sh_fifo_pop(&ff); 434 CuAssertPtrEquals(tc, NULL, p); 435 } 436 437 #endif 438 439 440 441 -
trunk/src/sh_files.c
r465 r481 88 88 #include "sh_inotify.h" 89 89 #include "zAVLTree.h" 90 #include "sh_dbIO.h" 90 91 91 92 #undef FIL__ … … 211 212 } 212 213 214 char * sh_files_parse_input(const char * str_s, size_t * len) 215 { 216 char * p; 217 218 if (!str_s || *str_s == '\0') 219 return NULL; 220 221 *len = sl_strlen(str_s); 222 223 if ( (str_s[0] == '"' && str_s[*len-1] == '"' ) || 224 (str_s[0] == '\'' && str_s[*len-1] == '\'') ) 225 { 226 if (*len < 3) 227 return NULL; 228 --(*len); 229 p = sh_util_strdup_l(&str_s[1], *len); 230 p[*len-1] = '\0'; 231 --(*len); 232 } 233 else 234 { 235 p = sh_util_strdup_l(str_s, *len); 236 } 237 238 p = sh_files_C_dequote(p, len); 239 240 return p; 241 } 242 243 213 244 extern int flag_err_debug; 214 245 extern int flag_err_info; … … 251 282 char * name; 252 283 int class; 253 unsigned long check_ mask;284 unsigned long check_flags; 254 285 int rdepth; 255 286 short checked; … … 322 353 SL_RETURN((-1), _("sh_files_setrecursion")); 323 354 324 if (sh.flag.opts == 1)355 if (sh.flag.opts == S_TRUE) 325 356 reject = 1; 326 357 … … 380 411 tmp); 381 412 } 382 #ifndef REPLACE_OLD 383 /* this will tell that we have seen the file, and thus prevent 384 * deletion from the database, resulting in an incomplete 385 * message when the file reappears 386 */ 387 if (sh.flag.checkSum != SH_CHECK_INIT) 388 sh_hash_set_visited_true(ptr->name); 389 #else 413 390 414 if (sh.flag.checkSum != SH_CHECK_INIT) 391 415 sh_hash_set_missing(ptr->name); 392 #endif 416 393 417 if (sh.flag.reportonce == S_TRUE) 394 418 SET_SH_FFLAG_REPORTED(ptr->is_reported); … … 431 455 } 432 456 } 433 #ifndef REPLACE_OLD 434 if (sh.flag.checkSum != SH_CHECK_INIT) 435 sh_hash_set_visited_true(ptr->name); 436 #else 457 437 458 /* delete from database 438 459 */ 439 460 if (sh.flag.checkSum != SH_CHECK_INIT) 440 461 sh_hash_set_missing(ptr->name); 441 #endif442 462 } 443 463 else … … 494 514 495 515 496 if (flag_err_info == S L_TRUE)516 if (flag_err_info == S_TRUE) 497 517 { 498 518 char pstr[32]; … … 508 528 { 509 529 sh_inotify_add_watch_later(ptr->name, &sh_file_watches, NULL, 510 ptr->class, ptr->check_ mask,530 ptr->class, ptr->check_flags, 511 531 SH_INOTIFY_FILE, 0); 512 532 } … … 514 534 BREAKEXIT(sh_files_filecheck); 515 535 tmp_reported = ptr->is_reported; /* fix aliasing warning */ 516 status = sh_files_filecheck (ptr->class, ptr->check_ mask, dir, file,536 status = sh_files_filecheck (ptr->class, ptr->check_flags, dir, file, 517 537 &tmp_reported, 0); 518 538 ptr->is_reported = tmp_reported; … … 590 610 } 591 611 592 static void * sh_dummy_candidate;612 void * sh_dummy_621_candidate; 593 613 594 614 static char * intern_find_morespecific_dir(zAVLTree * tree, … … 605 625 return NULL; 606 626 607 sh_dummy_ candidate = (void *) &candidate;627 sh_dummy_621_candidate = (void *) &candidate; 608 628 609 629 SH_MUTEX_LOCK(mutex_zfiles); … … 1069 1089 1070 1090 int sh_files_push_file_int (int class, const char * str_s, size_t len, 1071 unsigned long check_ mask)1091 unsigned long check_flags) 1072 1092 { 1073 1093 dirstack_t * new_item_ptr; … … 1085 1105 new_item_ptr->name = fileName; 1086 1106 new_item_ptr->class = class; 1087 new_item_ptr->check_ mask = check_mask;1107 new_item_ptr->check_flags = check_flags; 1088 1108 new_item_ptr->rdepth = 0; 1089 1109 new_item_ptr->checked = S_FALSE; … … 1122 1142 { 1123 1143 int reported; 1124 unsigned long check_ mask= sh_files_maskof(class);1144 unsigned long check_flags = sh_files_maskof(class); 1125 1145 1126 1146 if ((sh.flag.inotify & SH_INOTIFY_INSCAN) != 0) 1127 1147 { 1128 sh_files_filecheck (class, check_ mask, str_s, NULL,1148 sh_files_filecheck (class, check_flags, str_s, NULL, 1129 1149 &reported, 0); 1130 1150 if (SH_FFLAG_REPORTED_SET(reported)) 1131 1151 sh_files_set_file_reported(str_s); 1132 1152 sh_inotify_add_watch_later(str_s, &sh_file_watches, NULL, 1133 class, check_ mask,1153 class, check_flags, 1134 1154 SH_INOTIFY_FILE, 0); 1135 1155 } 1136 1156 1137 if (MODI_AUDIT_ENABLED(check_ mask))1157 if (MODI_AUDIT_ENABLED(check_flags)) 1138 1158 { 1139 1159 sh_audit_mark(str_s); … … 1144 1164 } 1145 1165 1146 int sh_files_push_dir_int (int class, char * tail, size_t len, int rdepth, unsigned long check_ mask);1166 int sh_files_push_dir_int (int class, char * tail, size_t len, int rdepth, unsigned long check_flags); 1147 1167 1148 1168 #ifdef HAVE_GLOB_H … … 1151 1171 char * name; 1152 1172 int class; 1153 unsigned long check_ mask;1173 unsigned long check_flags; 1154 1174 int rdepth; 1155 1175 short type; … … 1160 1180 1161 1181 static int sh_files_pushglob (int class, int type, const char * p, int rdepth, 1162 unsigned long check_ mask_in, int flag)1182 unsigned long check_flags_in, int flag) 1163 1183 { 1164 1184 int globstatus = -1; … … 1167 1187 1168 1188 volatile int count = 0; 1169 volatile unsigned long check_ mask = (flag == 0) ? sh_files_maskof(class) : check_mask_in;1189 volatile unsigned long check_flags = (flag == 0) ? sh_files_maskof(class) : check_flags_in; 1170 1190 1171 1191 SL_ENTER(_("sh_files_pushglob")); … … 1190 1210 new_item_ptr->name = fileName; 1191 1211 new_item_ptr->class = class; 1192 new_item_ptr->check_ mask = check_mask;1212 new_item_ptr->check_flags = check_flags; 1193 1213 new_item_ptr->rdepth = rdepth; 1194 1214 new_item_ptr->type = type; … … 1219 1239 { 1220 1240 count += sh_files_push_file_int (class, pglob.gl_pathv[gloop], 1221 sl_strlen(pglob.gl_pathv[gloop]), check_ mask);1241 sl_strlen(pglob.gl_pathv[gloop]), check_flags); 1222 1242 } 1223 1243 else … … 1226 1246 1227 1247 count += sh_files_push_dir_int (class, pglob.gl_pathv[gloop], 1228 sl_strlen(pglob.gl_pathv[gloop]), rdepth, check_ mask);1248 sl_strlen(pglob.gl_pathv[gloop]), rdepth, check_flags); 1229 1249 } 1230 1250 } … … 1285 1305 sh_files_pushglob(testPattern->class, testPattern->type, 1286 1306 testPattern->name, testPattern->rdepth, 1287 testPattern->check_ mask, 1);1307 testPattern->check_flags, 1); 1288 1308 } 1289 1309 } … … 1306 1326 sh_files_pushglob(testPattern->class, testPattern->type, 1307 1327 testPattern->name, testPattern->rdepth, 1308 testPattern->check_ mask, 1);1328 testPattern->check_flags, 1); 1309 1329 } 1310 1330 SH_MUTEX_UNLOCK(mutex_zglob); … … 1370 1390 * is the only one -- and will stay the only one 1371 1391 */ 1372 if (sh.flag.opts == 1)1392 if (sh.flag.opts == S_TRUE) 1373 1393 { 1374 1394 sh_files_delfilestack (); … … 1378 1398 } 1379 1399 1380 if (str_s == NULL || str_s[0] == '\0') 1381 SL_RETURN((-1),_("sh_files_pushfile")); 1382 1383 len = sl_strlen(str_s); 1384 1385 if ( (str_s[0] == '"' && str_s[len-1] == '"' ) || 1386 (str_s[0] == '\'' && str_s[len-1] == '\'') ) 1387 { 1388 if (len < 3) 1389 SL_RETURN((-1),_("sh_files_pushfile")); 1390 --len; 1391 p = sh_util_strdup_l(&str_s[1], len); 1392 p[len-1] = '\0'; 1393 --len; 1394 } 1395 else 1396 { 1397 p = sh_util_strdup_l(str_s, len); 1398 } 1399 1400 p = sh_files_C_dequote(p, &len); 1400 p = sh_files_parse_input(str_s, &len); 1401 1401 if (!p || len == 0) 1402 1402 SL_RETURN((-1), _("sh_files_pushfile")); … … 1491 1491 } 1492 1492 1493 static void * sh_dummy_ptr;1493 void * sh_dummy_1493_ptr; 1494 1494 1495 1495 unsigned long sh_dirs_chk (int which) … … 1507 1507 SL_ENTER(_("sh_dirs_chk")); 1508 1508 1509 sh_dummy_ ptr = (void *) &ptr;1509 sh_dummy_1493_ptr = (void *) &ptr; 1510 1510 1511 1511 SH_MUTEX_RECURSIVE_INIT(mutex_zdirs); … … 1536 1536 BREAKEXIT(sh_files_filecheck); 1537 1537 tmp_reported = dst_ptr->is_reported; 1538 filetype = sh_files_filecheck (dst_ptr->class, dst_ptr->check_ mask,1538 filetype = sh_files_filecheck (dst_ptr->class, dst_ptr->check_flags, 1539 1539 ptr->name, 1540 1540 NULL, &tmp_reported, 0); … … 1555 1555 { 1556 1556 tmp_reported = ptr->is_reported; 1557 filetype = sh_files_filecheck (ptr->class, ptr->check_ mask,1557 filetype = sh_files_filecheck (ptr->class, ptr->check_flags, 1558 1558 ptr->name, NULL, &tmp_reported, 0); 1559 1559 ptr->is_reported = tmp_reported; … … 1562 1562 1563 1563 BREAKEXIT(sh_files_checkdir); 1564 status = sh_files_checkdir (ptr->class, ptr->check_ mask,1564 status = sh_files_checkdir (ptr->class, ptr->check_flags, 1565 1565 ptr->rdepth, ptr->name, 1566 1566 ptr->name); … … 1710 1710 } 1711 1711 1712 int sh_files_push_dir_int (int class, char * tail, size_t len, int rdepth, unsigned long check_ mask)1712 int sh_files_push_dir_int (int class, char * tail, size_t len, int rdepth, unsigned long check_flags) 1713 1713 { 1714 1714 zAVLTree * tree; … … 1726 1726 new_item_ptr->name = dirName; 1727 1727 new_item_ptr->class = class; 1728 new_item_ptr->check_ mask = check_mask;1728 new_item_ptr->check_flags = check_flags; 1729 1729 new_item_ptr->rdepth = rdepth; 1730 1730 new_item_ptr->checked = S_FALSE; … … 1776 1776 else 1777 1777 { 1778 if (MODI_AUDIT_ENABLED(check_ mask))1778 if (MODI_AUDIT_ENABLED(check_flags)) 1779 1779 { 1780 1780 sh_audit_mark(tail); … … 1794 1794 SL_ENTER(_("sh_files_pushdir")); 1795 1795 1796 if (sh.flag.opts == 1) {1796 if (sh.flag.opts == S_TRUE) { 1797 1797 sh_files_delfilestack (); 1798 1798 sh_files_deldirstack (); … … 1800 1800 } 1801 1801 1802 if (str_s == NULL || str_s[0] == '\0') 1802 p = sh_files_parse_input(str_s, &len); 1803 if (!p || len == 0) 1803 1804 SL_RETURN((-1),_("sh_files_pushdir")); 1804 1805 len = sl_strlen(str_s);1806 1807 if ( (str_s[0] == '"' && str_s[len-1] == '"' ) ||1808 (str_s[0] == '\'' && str_s[len-1] == '\'') )1809 {1810 if (len < 3)1811 SL_RETURN((-1),_("sh_files_pushdir"));1812 --len;1813 p = sh_util_strdup_l(&str_s[1], len);1814 p[len-1] = '\0';1815 --len;1816 }1817 else1818 {1819 p = sh_util_strdup_l(str_s, len);1820 }1821 1822 p = sh_files_C_dequote(p, &len);1823 if (!p || len == 0)1824 SL_RETURN((-1), _("sh_files_pushdir"));1825 1805 1826 1806 if (p[0] != '/') … … 2048 2028 * check the directory inode itself. 2049 2029 */ 2050 int sh_files_checkdir (int iclass, unsigned long check_ mask,2030 int sh_files_checkdir (int iclass, unsigned long check_flags, 2051 2031 int idepth, char * iname, 2052 2032 char * relativeName) … … 2073 2053 volatile int class_next; 2074 2054 volatile int file_class_next; 2075 volatile unsigned long check_ mask_next;2076 volatile unsigned long file_check_ mask_next;2055 volatile unsigned long check_flags_next; 2056 volatile unsigned long file_check_flags_next; 2077 2057 2078 2058 volatile int checked_flag = S_FALSE; … … 2114 2094 } 2115 2095 2116 if (flag_err_info == S L_TRUE)2096 if (flag_err_info == S_TRUE) 2117 2097 { 2118 2098 char pstr[32]; … … 2149 2129 theFile->attr_string = NULL; 2150 2130 theFile->link_path = NULL; 2151 theFile->check_ mask = check_mask;2131 theFile->check_flags = check_flags; 2152 2132 2153 2133 (void) relativeName; … … 2190 2170 { 2191 2171 sh_inotify_add_watch_later(iname, &sh_file_watches, &status, 2192 iclass, check_ mask, SH_INOTIFY_DIR, idepth);2172 iclass, check_flags, SH_INOTIFY_DIR, idepth); 2193 2173 } 2194 2174 … … 2301 2281 rdepth_next = rdepth - 1; 2302 2282 class_next = class; 2303 check_ mask_next = check_mask;2283 check_flags_next = check_flags; 2304 2284 file_class_next = class; 2305 file_check_ mask_next = check_mask;2285 file_check_flags_next = check_flags; 2306 2286 checked_flag = -1; 2307 2287 cchecked_flag = -1; … … 2322 2302 */ 2323 2303 file_class_next = dst_ptr->class; 2324 file_check_ mask_next = dst_ptr->check_mask;2304 file_check_flags_next = dst_ptr->check_flags; 2325 2305 checked_flag = dst_ptr->checked; 2326 2306 cchecked_flag = dst_ptr->childs_checked; … … 2338 2318 */ 2339 2319 file_class_next = dst_ptr->class; 2340 file_check_ mask_next = dst_ptr->check_mask;2320 file_check_flags_next = dst_ptr->check_flags; 2341 2321 checked_flag = dst_ptr->checked; 2342 2322 cchecked_flag = dst_ptr->childs_checked; … … 2355 2335 */ 2356 2336 file_class_next = dst_ptr->class; 2357 file_check_ mask_next = dst_ptr->check_mask;2337 file_check_flags_next = dst_ptr->check_flags; 2358 2338 checked_flag = dst_ptr->checked; 2359 2339 /* not set, hence always FALSE */ … … 2403 2383 */ 2404 2384 2405 checkit = sh_files_filecheck (file_class_next, file_check_ mask_next,2385 checkit = sh_files_filecheck (file_class_next, file_check_flags_next, 2406 2386 iname, 2407 2387 dirlist->sh_d_name, … … 2453 2433 rdepth_next = tmp_ptr->rdepth; 2454 2434 class_next = tmp_ptr->class; 2455 check_ mask_next = tmp_ptr->check_mask;2435 check_flags_next = tmp_ptr->check_flags; 2456 2436 /* 28. Aug 2001 reversed 2457 2437 */ … … 2471 2451 rdepth_next = tmp_ptr->rdepth; 2472 2452 class_next = tmp_ptr->class; 2473 check_ mask_next = tmp_ptr->check_mask;2453 check_flags_next = tmp_ptr->check_flags; 2474 2454 /* 28. Aug 2001 reversed 2475 2455 */ … … 2491 2471 if (cchecked_flag == S_FALSE) 2492 2472 { 2493 sh_files_checkdir (class_next, check_ mask_next, rdepth_next,2473 sh_files_checkdir (class_next, check_flags_next, rdepth_next, 2494 2474 tmpcat, dirlist->sh_d_name); 2495 2475 /* … … 2499 2479 } 2500 2480 else if (checked_flag == -1) 2501 sh_files_checkdir (class_next, check_ mask_next, rdepth_next,2481 sh_files_checkdir (class_next, check_flags_next, rdepth_next, 2502 2482 tmpcat, dirlist->sh_d_name); 2503 2483 … … 2532 2512 } while (dirlist != NULL); 2533 2513 2534 if (flag_err_info == S L_TRUE)2514 if (flag_err_info == S_TRUE) 2535 2515 { 2536 2516 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_FI_DSUM, … … 2576 2556 } 2577 2557 2558 void sh_files_fixup_mask (int class, unsigned long * check_flags) 2559 { 2560 if (class == SH_LEVEL_ALLIGNORE) 2561 MODI_SET((*check_flags), MODI_ALLIGNORE); 2562 sh_tiger_get_mask_hashtype(check_flags); 2563 return; 2564 } 2565 2578 2566 int get_the_fd (SL_TICKET ticket); 2579 2567 … … 2589 2577 static void * sh_dummy_tmpdir; 2590 2578 2591 ShFileType sh_files_filecheck (int class, unsigned long check_ mask,2579 ShFileType sh_files_filecheck (int class, unsigned long check_flags, 2592 2580 const char * dirName, 2593 2581 const char * infileName, … … 2701 2689 */ 2702 2690 sl_strlcpy (theFile->fullpath, fullpath, PATH_MAX); 2703 theFile->check_ mask = check_mask/* sh_files_maskof(class) */;2691 theFile->check_flags = check_flags /* sh_files_maskof(class) */; 2704 2692 theFile->file_reported = (*reported); 2705 2693 theFile->attr_string = NULL; … … 2712 2700 fileName, 2713 2701 theFile, fileHash, class); 2714 2702 2715 2703 if (status != 0) 2716 2704 { … … 2732 2720 /* report 2733 2721 */ 2734 if ((flag_err_debug == S L_TRUE) && (theFile->c_mode[0] == '-'))2722 if ((flag_err_debug == S_TRUE) && (theFile->c_mode[0] == '-')) 2735 2723 { 2736 2724 tmpname = sh_util_safe_name (fullpath); /* fixed in 1.5.4 */ … … 2743 2731 ++sh.statistics.files_checked; 2744 2732 2745 if ( sh.flag.checkSum == SH_CHECK_INIT /* && sh.flag.update == S_FALSE */) 2746 { 2747 sh_hash_pushdata (theFile, fileHash); 2733 if ( sh.flag.checkSum == SH_CHECK_INIT) 2734 { 2735 if (class == SH_LEVEL_ALLIGNORE) 2736 MODI_SET(theFile->check_flags, MODI_ALLIGNORE); 2737 if (S_TRUE == sh_ignore_chk_mod(theFile->fullpath)) 2738 MODI_SET(theFile->check_flags, MODI_NOCHECK); 2739 sh_tiger_get_mask_hashtype(&(theFile->check_flags)); 2740 sh_dbIO_data_write (theFile, fileHash); 2748 2741 } 2749 2742 else if (sh.flag.checkSum == SH_CHECK_CHECK … … 2752 2745 ) 2753 2746 { 2747 if (sh.flag.update == S_TRUE) 2748 { 2749 if (class == SH_LEVEL_ALLIGNORE) 2750 MODI_SET(theFile->check_flags, MODI_ALLIGNORE); 2751 if (S_TRUE == sh_ignore_chk_mod(theFile->fullpath)) 2752 MODI_SET(theFile->check_flags, MODI_NOCHECK); 2753 sh_tiger_get_mask_hashtype(&(theFile->check_flags)); 2754 } 2754 2755 sh_hash_compdata (class, theFile, fileHash, NULL, -1); 2755 2756 } … … 2760 2761 */ 2761 2762 #if !defined(O_NOATIME) 2762 if (class == SH_LEVEL_NOIGNORE && (theFile->check_ mask& MODI_ATM) != 0)2763 if (class == SH_LEVEL_NOIGNORE && (theFile->check_flags & MODI_ATM) != 0) 2763 2764 { 2764 2765 utime_buf.actime = (time_t) theFile->atime; … … 2792 2793 if (S_TRUE == sh_unix_file_exists (testpath)) 2793 2794 { 2794 sh_files_filecheck (class, check_ mask, fullpath, rsrc, &dummy, 1);2795 sh_files_filecheck (class, check_flags, fullpath, rsrc, &dummy, 1); 2795 2796 } 2796 2797 } … … 2860 2861 */ 2861 2862 int sh_files_search_dir(char * name, int * class, 2862 unsigned long *check_ mask, int *reported,2863 unsigned long *check_flags, int *reported, 2863 2864 int * rdepth) 2864 2865 { … … 2877 2878 if (item) 2878 2879 { 2879 *check_ mask = item->check_mask;2880 *check_flags = item->check_flags; 2880 2881 *class = item->class; 2881 2882 *reported = item->is_reported; … … 2892 2893 if (item) 2893 2894 { 2894 *check_ mask = item->check_mask;2895 *check_flags = item->check_flags; 2895 2896 *class = item->class; 2896 2897 *reported = item->is_reported; … … 2914 2915 if (0 == fnmatch(testPattern->name, name, FNM_PATHNAME|FNM_PERIOD)) 2915 2916 { 2916 *check_ mask = testPattern->check_mask;2917 *check_flags = testPattern->check_flags; 2917 2918 *class = testPattern->class; 2918 2919 *rdepth = testPattern->rdepth; … … 2932 2933 2933 2934 int sh_files_search_file(char * name, int * class, 2934 unsigned long *check_ mask, int *reported)2935 unsigned long *check_flags, int *reported) 2935 2936 { 2936 2937 volatile int retval = 0; … … 2946 2947 if (item) 2947 2948 { 2948 *check_ mask = item->check_mask;2949 *check_flags = item->check_flags; 2949 2950 *class = item->class; 2950 2951 *reported = item->is_reported; … … 2966 2967 FNM_PATHNAME|FNM_PERIOD)) 2967 2968 { 2968 *check_ mask = testPattern->check_mask;2969 *check_flags = testPattern->check_flags; 2969 2970 *class = testPattern->class; 2970 2971 retval = 1; … … 3035 3036 { 3036 3037 if (0 == strcmp(name, pfilL->name) && 3037 (pfilL->check_ mask& MODI_ATM) == 0 &&3038 (pfilL->check_ mask& MODI_CTM) == 0 &&3039 (pfilL->check_ mask& MODI_MTM) == 0)3038 (pfilL->check_flags & MODI_ATM) == 0 && 3039 (pfilL->check_flags & MODI_CTM) == 0 && 3040 (pfilL->check_flags & MODI_MTM) == 0) 3040 3041 { 3041 3042 retval = 0; … … 3087 3088 (0 == strncmp(pfilL->name, pdirL->name, dlen))) 3088 3089 { 3089 if ((pdirL->check_ mask& MODI_ATM) != 0 ||3090 (pdirL->check_ mask& MODI_MTM) != 0 ||3091 (pdirL->check_ mask& MODI_CTM) != 0)3090 if ((pdirL->check_flags & MODI_ATM) != 0 || 3091 (pdirL->check_flags & MODI_MTM) != 0 || 3092 (pdirL->check_flags & MODI_CTM) != 0) 3092 3093 { 3093 3094 if (check_file (pdirL->name) != 0) -
trunk/src/sh_filetype.c
r454 r481 406 406 } 407 407 408 /* fprintf(stderr, "FIXME: %d %d %s ", dtype, length, type); */409 /**410 if (dtype == 0)411 fprintf(stderr, "%s\n", pattern);412 else413 {414 int k;415 for (k = 0; k < length; ++k)416 fprintf(stderr, "0x%X", (unsigned int) (pattern[k]));417 fprintf(stderr, "\n");418 }419 **/420 421 408 for (i = 0; i < n; ++i) 422 409 { … … 523 510 p = &buffer[sh_ftype_arr[i]->offset]; 524 511 525 #if 0526 {527 int dd;528 /* fprintf(stderr, "FIXME: %03d comp %d:%d ", i,529 sh_ftype_arr[i]->offset, sh_ftype_arr[i]->length); */530 for (dd = 0; dd < sh_ftype_arr[i]->length; ++dd) {531 fprintf(stderr, "0x%X ", sh_ftype_arr[i]->pattern[dd]);532 }533 for (dd = 0; dd < sh_ftype_arr[i]->length; ++dd) {534 fprintf(stderr, "0x%X ", p[dd]);535 }536 fprintf(stderr, "\n");537 }538 #endif539 540 512 if (0 == memcmp(p, sh_ftype_arr[i]->pattern, sh_ftype_arr[i]->length)) 541 513 { … … 582 554 long len; 583 555 584 len = sl_read_timeout (ft, buffer, sizeof(buffer), 12, S L_TRUE);556 len = sl_read_timeout (ft, buffer, sizeof(buffer), 12, S_TRUE); 585 557 586 558 sl_rewind(ft); -
trunk/src/sh_getopt.c
r467 r481 34 34 #include "sh_utils.h" 35 35 #include "sh_mail.h" 36 #include "sh_ forward.h"36 #include "sh_xfer.h" 37 37 #include "sh_hash.h" 38 #include "sh_dbIO.h" 39 #include "sh_dbCheck.h" 40 #include "sh_dbCreate.h" 41 #include "sh_sem.h" 38 42 39 43 #if defined(WITH_EXTERNAL) … … 64 68 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 65 69 static int sh_getopt_forever (const char * dummy); 70 static int sh_getopt_outpath (const char * dummy); 66 71 #endif 67 72 static int sh_getopt_copyright (const char * dummy); … … 92 97 N_("Set the server port to connect to"), 93 98 HAS_ARG_YES, 94 sh_ forward_server_port },99 sh_xfer_server_port }, 95 100 { N_("server-host"), 96 101 '-', 97 102 N_("Set the server host to connect to"), 98 103 HAS_ARG_YES, 99 sh_ forward_setlogserver },104 sh_xfer_set_logserver }, 100 105 #endif 101 106 #ifdef SH_WITH_SERVER … … 109 114 N_("Log fully qualified name of client host"), 110 115 HAS_ARG_NO, 111 sh_ forward_set_strip },116 sh_xfer_set_strip }, 112 117 { N_("chroot"), 113 118 '-', … … 222 227 N_("Compute a client registry entry for password"), 223 228 HAS_ARG_YES, 224 sh_ forward_make_client },229 sh_xfer_make_client }, 225 230 { N_("gen-password"), 226 231 'G', 227 232 N_("Generate a random password"), 228 233 HAS_ARG_NO, 229 sh_ forward_create_password },234 sh_xfer_create_password }, 230 235 #endif 231 236 … … 236 241 HAS_ARG_NO, 237 242 sh_getopt_forever}, 243 { N_("outfile"), 244 'o', 245 N_("Pathname for output file"), 246 HAS_ARG_YES, 247 sh_getopt_outpath}, 238 248 { N_("list-file"), 239 249 '-', 240 N_("Modify -d to listcontent of a single file"),250 N_("Modify -d to show content of a single file"), 241 251 HAS_ARG_YES, 242 252 set_list_file}, 253 { N_("list-filter"), 254 '-', 255 N_("Modify -d to filter by file list given in text file"), 256 HAS_ARG_YES, 257 sh_dbIO_list_filter}, 243 258 { N_("full-detail"), 244 259 'a', 245 N_("Modify -d to listfull details"),260 N_("Modify -d to show full details"), 246 261 HAS_ARG_NO, 247 262 set_full_detail}, 248 263 { N_("delimited"), 249 264 '-', 250 N_("Modify -d to listfull details, comma delimited"),265 N_("Modify -d to show full details, comma delimited"), 251 266 HAS_ARG_NO, 252 267 set_list_delimited}, 268 { N_("binary"), 269 '-', 270 N_("Modify -d to output in binary database format"), 271 HAS_ARG_NO, 272 sh_dbIO_list_binary}, 253 273 { N_("list-database"), 254 274 'd', 255 275 N_("List database content (like ls -l)"), 256 276 HAS_ARG_YES, 257 sh_ hash_list_db},277 sh_dbIO_list_db}, 258 278 { N_("init2stdout"), 259 279 '-', 260 280 N_("Write database to stdout on init"), 261 281 HAS_ARG_NO, 262 sh_hash_pushdata_stdout}, 282 sh_dbIO_writeout_stdout}, 283 { N_("verify-database"), 284 '-', 285 N_("Verify the given database"), 286 HAS_ARG_YES, 287 sh_dbCheck_verify}, 288 { N_("create-database"), 289 '-', 290 N_("Create database from file list"), 291 HAS_ARG_YES, 292 sh_dbCreate}, 293 { N_("wait-on-check"), 294 'w', 295 N_("Timed wait for end of filecheck (0 for no timeout)"), 296 HAS_ARG_YES, 297 sh_sem_wait}, 263 298 #endif 264 299 { N_("trace-logfile"), … … 744 779 sh.flag.loop = S_TRUE; 745 780 SL_RETURN(0, _("sh_getopt_forever")); 781 } 782 783 static int sh_getopt_outpath (const char * str) 784 { 785 if (str) 786 { 787 if (sh.outpath) 788 SH_FREE(sh.outpath); 789 sh.outpath = sh_util_strdup(str); 790 return 0; 791 } 792 return -1; 746 793 } 747 794 #endif -
trunk/src/sh_gpg.c
r474 r481 60 60 #include "sh_static.h" 61 61 #endif 62 #include "sh_gpg.h" 62 63 63 64 static struct { … … 128 129 SL_ENTER(_("sh_gpg_checksum")); 129 130 130 #if defined(WITH_PGP)131 test_gpg = sh_tiger_hash_gpg (DEFAULT_PGP_PATH, checkfd, TIGER_NOLIM);132 #else133 131 test_gpg = sh_tiger_hash_gpg (DEFAULT_GPG_PATH, checkfd, TIGER_NOLIM); 134 #endif135 132 136 133 test_ptr1 = strchr(GPG_HASH, ':'); … … 252 249 char cc1[32]; 253 250 char cc2[32]; 254 #if defined(WITH_PGP) 255 char cc3[32]; 256 char cc0[3] = "-f"; 257 #endif 258 #if defined(WITH_GPG) 251 259 252 char cc0[2] = "-"; 260 253 char cc3[32]; 261 254 char cc4[SH_PATHBUF+32]; 262 255 char cc5[32]; 263 #endif 256 264 257 265 258 char * arg[9]; … … 279 272 SL_ENTER(_("sh_gpg_popen")); 280 273 281 #if defined(WITH_GPG)282 274 /* -- GnuPG -- */ 283 275 sl_strlcpy (path, DEFAULT_GPG_PATH, 256); … … 387 379 (void) mode; 388 380 (void) id; 389 #elif defined(WITH_PGP)390 /* -- PGP -- */391 sl_strlcpy (path, DEFAULT_PGP_PATH, 256);392 if (mode == 0)393 {394 sl_strlcpy (cc1, _("+language=en"), 32);395 sl_strlcpy (cc2, _("-o"), 32);396 sl_strlcpy (cc3, _("/dev/null"), 32);397 398 arg[0] = path;399 arg[1] = cc1;400 arg[2] = cc2;401 arg[3] = cc3;402 arg[4] = cc0;403 arg[5] = NULL;404 }405 else406 {407 sl_strlcpy (cc1, _("+language=en"), 32);408 sl_strlcpy (cc2, _("-kvc"), 32);409 410 arg[0] = path;411 arg[1] = cc1;412 arg[2] = cc2;413 arg[3] = id;414 arg[4] = NULL;415 arg[5] = NULL;416 }417 #endif418 381 419 382 /* use homedir of effective user … … 467 430 sl_close_fd (FIL__, __LINE__, pipedes[STDOUT_FILENO]); 468 431 469 470 #if defined(WITH_PGP)471 if (mode == 0)472 {473 if (retry_aud_dup2(FIL__, __LINE__, fd, STDIN_FILENO) < 0)474 {475 TPT(((0), FIL__, __LINE__, _("msg=<dup2 on fd failed>\n")));476 dlog(1, FIL__, __LINE__, _("Internal error: dup2 failed\n"));477 aud__exit(FIL__, __LINE__, EXIT_FAILURE);478 }479 }480 #else481 432 if (retry_aud_dup2(FIL__, __LINE__, fd, STDIN_FILENO) < 0) 482 433 { … … 485 436 aud__exit(FIL__, __LINE__, EXIT_FAILURE); 486 437 } 487 #endif488 438 489 439 /* don't leak file descriptors 490 440 */ 491 sh_unix_closeall (3, -1, S L_TRUE); /* in child process */492 493 if (flag_err_debug != S L_TRUE)441 sh_unix_closeall (3, -1, S_TRUE); /* in child process */ 442 443 if (flag_err_debug != S_TRUE) 494 444 { 495 445 if (NULL == freopen(_("/dev/null"), "r+", stderr)) … … 530 480 * -- emulate an fexecve with checksum testing 531 481 */ 532 #if defined(WITH_PGP)533 checkfd = sl_open_read(FIL__, __LINE__, DEFAULT_PGP_PATH, SL_NOPRIV);534 #else535 482 checkfd = sl_open_read(FIL__, __LINE__, DEFAULT_GPG_PATH, SL_NOPRIV); 536 #endif537 483 538 484 if (0 != sh_gpg_checksum(checkfd, 0)) … … 580 526 for (i = 0; i < myrand; ++i) 581 527 { 582 #if defined(WITH_PGP) 583 checkfd = sl_open_fastread(FIL__, __LINE__, DEFAULT_PGP_PATH, SL_NOPRIV); 584 #else 585 checkfd = sl_open_fastread(FIL__, __LINE__, DEFAULT_GPG_PATH, SL_NOPRIV); 586 #endif 528 checkfd = sl_open_fastread(FIL__, __LINE__, 529 DEFAULT_GPG_PATH, SL_NOPRIV); 530 587 531 if (0 != sh_gpg_checksum(checkfd, 0)) { 588 532 aud__exit(FIL__, __LINE__, EXIT_FAILURE); … … 591 535 } 592 536 #endif 593 594 595 #if defined(WITH_GPG) 537 596 538 retry_aud_execve (FIL__, __LINE__, DEFAULT_GPG_PATH, arg, envp); 597 539 dlog(1, FIL__, __LINE__, _("Unexpected error: execve %s failed\n"), 598 540 DEFAULT_GPG_PATH); 599 #elif defined(WITH_PGP)600 retry_aud_execve (FIL__, __LINE__, DEFAULT_PGP_PATH, arg, envp);601 #endif602 541 603 542 /* failed … … 659 598 sh_gpg_popen_t source; 660 599 int have_id = BAD, have_fp = BAD, status = 0; 661 #ifdef WITH_PGP662 char *ptr;663 #endif664 600 665 601 #ifdef HAVE_GPG_CHECKSUM … … 671 607 /* check whether GnuPG exists and has the correct checksum 672 608 */ 673 #if defined(WITH_GPG)674 675 609 TPT(((0), FIL__, __LINE__, _("msg=<Check signature>\n"))); 676 610 TPT(((0), FIL__, __LINE__, _("msg=<gpg is %s>\n"), DEFAULT_GPG_PATH)); … … 701 635 } 702 636 sl_close(checkfd); 703 #endif704 705 #elif defined(WITH_PGP)706 707 TPT(((0), FIL__, __LINE__, _("msg=<Check signature>\n")));708 TPT(((0), FIL__, __LINE__, _("msg=<pgp is %s>\n"), DEFAULT_PGP_PATH));709 710 if (0 != retry_lstat(FIL__, __LINE__, DEFAULT_PGP_PATH, &buf))711 {712 char errbuf[SH_ERRBUF_SIZE];713 714 status = errno;715 sh_error_handle(SH_ERR_ERR, FIL__, __LINE__, status, MSG_ERR_LSTAT,716 sh_error_message(status, errbuf, sizeof(errbuf)), DEFAULT_PGP_PATH);717 SL_RETURN( SH_GPG_BAD, _("sh_gpg_check_file_sign"));718 }719 if (0 != tf_trust_check (DEFAULT_PGP_PATH, SL_YESPRIV))720 SL_RETURN( SH_GPG_BAD, _("sh_gpg_check_file_sign"));721 722 #ifdef HAVE_GPG_CHECKSUM723 checkfd = sl_open_read(FIL__, __LINE__, DEFAULT_PGP_PATH, SL_YESPRIV);724 725 if (0 != sh_gpg_checksum(checkfd, 1))726 {727 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_E_SUBGEN,728 _("Checksum mismatch"),729 _("gpg_check_file_sign"));730 sl_close(checkfd);731 SL_RETURN( SH_GPG_BAD, _("sh_gpg_check_file_sign"));732 }733 sl_close(checkfd);734 #endif735 736 637 #endif 737 638 … … 768 669 if (sl_strlen(line) < 18) 769 670 continue; 770 #if defined(WITH_GPG) 671 771 672 /* Sun May 27 18:40:05 CEST 2001 772 673 */ … … 821 722 have_fp = GOOD; 822 723 } 823 #elif defined(WITH_PGP)824 if (0 == sl_strncmp(_("Bad signature"), line, 13) ||825 0 == sl_strncmp(_("Error"), line, 5) ||826 0 == sl_strncmp(_("Malformed"), line, 9) ||827 0 == sl_strncmp(_("WARNING"), line, 7) ||828 0 == sl_strncmp(_("ERROR"), line, 5)829 )830 {831 have_fp = BAD; have_id = BAD;832 break;833 }834 if (0 == sl_strncmp(_("Good signature"), line, 14))835 {836 ptr = strchr ( line, '"');837 ++ptr;838 if (ptr)839 {840 sl_strlcpy (sign_id, ptr, SH_MINIBUF+1);841 sign_id[sl_strlen(sign_id)-1] = '\0'; /* remove trailing dot */842 sign_id[sl_strlen(sign_id)-2] = '\0'; /* remove trailing '"' */843 }844 else845 {846 sl_strlcpy (sign_id, _("(null)"), SH_MINIBUF+1);847 }848 have_id = GOOD;849 }850 #endif851 724 } 852 725 853 726 if (ferror(source.pipe) && errno == EAGAIN) 854 727 { 855 retry_msleep(0,10); /* sleep 10 ms to avoid starving the gpg child writing to the pipe */ 728 /* sleep 10 ms to avoid starving the gpg child writing to the pipe */ 729 retry_msleep(0,10); 856 730 clearerr(source.pipe); 857 731 goto xagain; … … 862 736 TPT(((0), FIL__, __LINE__, _("msg=<Close pipe>\n"))); 863 737 864 #ifdef WITH_PGP865 /* get the fingerprint */866 867 source.pipe = sh_gpg_popen ( &source, fd, 1, sign_id, homedir);868 if (NULL == source.pipe)869 {870 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_E_SUBGEN,871 _("Could not open pipe for fp"),872 _("gpg_check_file_sign"));873 SL_RETURN( SH_GPG_BAD, _("sh_gpg_check_file_sign"));874 }875 876 TPT(((0), FIL__, __LINE__, _("msg=<Open pipe success>\n")));877 878 yagain:879 880 errno = 0;881 882 while (NULL != fgets(line, sizeof(line), source.pipe))883 {884 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_STRTOK_R)885 char * saveptr = NULL;886 #endif887 if (line[strlen(line)-1] == '\n')888 line[strlen(line)-1] = ' ';889 sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, 0, MSG_E_SUBGEN,890 line,891 _("gpg_check_file_sign"));892 893 if (sl_strlen(line) < 18)894 continue;895 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_STRTOK_R)896 ptr = strtok_r (line, " ", &saveptr);897 #else898 ptr = strtok (line, " ");899 #endif900 while (ptr)901 {902 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_STRTOK_R)903 ptr = strtok_r (NULL, " ", &saveptr);904 #else905 ptr = strtok (NULL, " ");906 #endif907 if (ptr && 0 == sl_strncmp (ptr, _("fingerprint"), 11))908 {909 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_STRTOK_R)910 ptr = strtok_r (NULL, " ", &saveptr); /* to '=' */911 #else912 ptr = strtok (NULL, " "); /* to '=' */913 #endif914 sign_fp[0] = '\0';915 while (ptr)916 {917 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_STRTOK_R)918 ptr = strtok_r (NULL, " ", &saveptr); /* part of fingerprint */919 #else920 ptr = strtok (NULL, " "); /* part of fingerprint */921 #endif922 sl_strlcat (sign_fp, ptr, SH_MINIBUF+1);923 }924 /* sign_fp[sl_strlen(sign_fp)-1] = '\0'; remove trailing '\n' */925 if (sl_strlen(sign_fp) > 0)926 have_fp = GOOD;927 break;928 }929 }930 }931 932 if (ferror(source.pipe) && errno == EAGAIN)933 {934 retry_msleep(0,10); /* sleep 10 ms to avoid starving the gpg child writing to the pipe */935 clearerr(source.pipe);936 goto yagain;937 }938 939 sh_gpg_pclose (&source);940 #endif941 942 738 if (have_id == GOOD) 943 739 { 944 740 TPT(((0), FIL__, __LINE__, _("msg=<Got signator ID>\n"))); 945 ;946 741 } 947 742 if (have_fp == GOOD) 948 743 { 949 744 TPT(((0), FIL__, __LINE__, _("msg=<Got fingerprint>\n"))); 950 ;951 745 } 952 746 … … 969 763 int get_the_fd(SL_TICKET file_1); 970 764 971 int sh_gpg_check_sign (long file_1, long file_2, int what) 765 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && \ 766 defined(HAVE_GETPWNAM_R) 767 #define USE_GETPWNAM_R 1 768 #endif 769 770 int sh_gpg_check_sign (long file, int what) 972 771 { 973 772 int status = SH_GPG_BAD; 974 int fd 1= 0;975 int fd2 = 0; 773 int fd = 0; 774 976 775 static int smsg = S_FALSE; 977 776 char * tmp; 978 char * tmp2; 777 778 char * sig_id; 779 char * sig_fp; 979 780 980 781 char * homedir = sh.effective.home; 981 782 #if defined(SH_WITH_SERVER) 982 783 struct passwd * tempres; 983 #if defined( HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)784 #if defined(USE_GETPWNAM_R) 984 785 struct passwd pwd; 985 786 char * buffer = SH_ALLOC(SH_PWBUF_SIZE); … … 994 795 995 796 996 if (what == 0 || what == 1) 997 fd1 = get_the_fd(file_1); 998 if (what == 0 || what == 2) 999 fd2 = get_the_fd(file_2); 1000 1001 1002 if (fd1 < 0 || fd2 < 0) 1003 { 1004 TPT(((0), FIL__, __LINE__, _("msg=<GPG_CHECK: FD1 = %d>\n"), fd1)); 1005 TPT(((0), FIL__, __LINE__, _("msg=<GPG_CHECK: FD2 = %d>\n"), fd2)); 797 if (what == SIG_CONF) 798 fd = get_the_fd(file); 799 if (what == SIG_DATA) 800 fd = get_the_fd(file); 801 802 803 if (fd < 0) 804 { 805 TPT(((0), FIL__, __LINE__, _("msg=<GPG_CHECK: FD = %d>\n"), fd)); 1006 806 dlog(1, FIL__, __LINE__, 1007 807 _("This looks like an unexpected internal error.\n")); 1008 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_EXIT_ABORT1, sh.prg_name); 1009 aud_exit (FIL__, __LINE__, EXIT_FAILURE); 808 #if defined(SH_WITH_SERVER) && defined(USE_GETPWNAM_R) 809 SH_FREE(buffer); 810 #endif 811 SL_RETURN( (-1), _("sh_gpg_check_sign")); 812 } 813 1010 814 #if defined(SH_WITH_SERVER) 1011 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R) 1012 SH_FREE(buffer); 1013 #endif 1014 #endif 1015 SL_RETURN( (-1), _("sh_gpg_check_sign")); 1016 } 1017 1018 if (what == 0 || what == 1) 1019 { 1020 TPT(((0), FIL__, __LINE__, _("msg=<GPG_CHECK: FD1 = %d>\n"), fd1)); 1021 #if defined(SH_WITH_SERVER) 1022 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R) 815 #if defined(USE_GETPWNAM_R) 1023 816 sh_getpwnam_r(DEFAULT_IDENT, &pwd, buffer, SH_PWBUF_SIZE, &tempres); 1024 817 #else 1025 818 tempres = sh_getpwnam(DEFAULT_IDENT); 1026 819 #endif 1027 1028 820 if ((tempres != NULL) && (0 == sl_ret_euid())) 1029 821 { … … 1032 824 } 1033 825 #endif 1034 status = sh_gpg_check_file_sign(fd1, gp.conf_id, gp.conf_fp, homedir, 1); 826 827 if (what == SIG_CONF) 828 { 829 TPT(((0), FIL__, __LINE__, _("msg=<GPG_CHECK: FD = %d>\n"), fd)); 830 status = sh_gpg_check_file_sign(fd, gp.conf_id, gp.conf_fp, homedir, 1); 1035 831 TPT(((0), FIL__, __LINE__, _("msg=<CONF SIGUSR: |%s|>\n"), gp.conf_id)); 1036 832 TPT(((0), FIL__, __LINE__, _("msg=<CONF SIGFP: |%s|>\n"), gp.conf_fp)); 1037 } 1038 1039 if ((what == 0 && SH_GPG_OK == status) || what == 2) 1040 { 1041 TPT(((0), FIL__, __LINE__, _("msg=<GPG_CHECK: FD2 = %d>\n"), fd2)); 1042 #if defined(SH_WITH_SERVER) 1043 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R) 1044 sh_getpwnam_r(DEFAULT_IDENT, &pwd, buffer, SH_PWBUF_SIZE, &tempres); 1045 #else 1046 tempres = sh_getpwnam(DEFAULT_IDENT); 1047 #endif 1048 1049 if ((tempres != NULL) && (0 == sl_ret_euid())) 1050 { 1051 /* privileges not dropped yet*/ 1052 homedir = tempres->pw_dir; 1053 } 1054 #endif 1055 status = sh_gpg_check_file_sign(fd2, gp.data_id, gp.data_fp, homedir, 2); 833 sig_id = gp.conf_id; sig_fp = gp.conf_fp; 834 } 835 836 if (what == SIG_DATA) 837 { 838 TPT(((0), FIL__, __LINE__, _("msg=<GPG_CHECK: FD = %d>\n"), fd)); 839 status = sh_gpg_check_file_sign(fd, gp.data_id, gp.data_fp, homedir, 2); 1056 840 TPT(((0), FIL__, __LINE__, _("msg=<DATA SIGUSR: |%s|>\n"), gp.data_id)); 1057 841 TPT(((0), FIL__, __LINE__, _("msg=<DATA SIGFP: |%s|>\n"), gp.data_fp)); 842 sig_id = gp.data_id; sig_fp = gp.data_fp; 1058 843 } 1059 844 1060 if (SH_GPG_OK == status && what == 1)845 if (SH_GPG_OK == status) 1061 846 { 1062 847 #ifdef USE_FINGERPRINT 1063 if ((sl_strcmp(SH_GPG_FP, gp.conf_fp) == 0))848 if ((sl_strcmp(SH_GPG_FP, sig_fp) == 0)) 1064 849 { 1065 850 int i; 1066 851 1067 for(i = 0; i < (int) sl_strlen(gp.conf_fp); ++i) 1068 { 1069 if (gpgfp[i] != gp.conf_fp[i]) 1070 { 1071 sh_error_handle(SH_ERR_SEVERE, FIL__, __LINE__, 0, 1072 MSG_E_GPG_FP, 1073 gpgfp, gp.conf_fp); 1074 break; 1075 } 1076 } 1077 1078 if (smsg == S_FALSE) 1079 { 1080 tmp = sh_util_safe_name(gp.conf_id); 1081 sh_gpg_fill_startup (__LINE__, 1082 /* sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_START_GH, */ 852 for(i = 0; i < (int) sl_strlen(sig_fp); ++i) { 853 if (gpgfp[i] != sig_fp[i]) { 854 sh_error_handle(SH_ERR_SEVERE, FIL__, __LINE__, 0, 855 MSG_E_GPG_FP, gpgfp, sig_fp); 856 break; } 857 } 858 859 if (smsg == S_FALSE) { 860 tmp = sh_util_safe_name(sig_id); 861 sh_gpg_fill_startup (__LINE__, sh.prg_name, sh.real.uid, 862 (sh.flag.hidefile == S_TRUE) ? 863 _("(hidden)") : file_path('C', 'R'), 864 tmp, 865 sig_fp); 866 SH_FREE(tmp); } 867 smsg = S_TRUE; 868 869 #if defined(SH_WITH_SERVER) && defined(USE_GETPWNAM_R) 870 SH_FREE(buffer); 871 #endif 872 SL_RETURN(0, _("sh_gpg_check_sign")); 873 } 874 else 875 { 876 /* fp mismatch */ 877 dlog(1, FIL__, __LINE__, 878 _("The fingerprint of the signing key: %s\ndoes not match the compiled-in fingerprint: %s.\nTherefore the signature could not be verified.\n"), 879 sig_fp, SH_GPG_FP); 880 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_E_SUBGEN, 881 _("Fingerprint mismatch"), _("gpg_check_sign")); 882 status = SH_GPG_BADSIGN; 883 } 884 #else /* ifdef USE_FINGERPRINT */ 885 if (smsg == S_FALSE) 886 { 887 tmp = sh_util_safe_name(sig_id); 888 sh_gpg_fill_startup (__LINE__, 1083 889 sh.prg_name, sh.real.uid, 1084 890 (sh.flag.hidefile == S_TRUE) ? 1085 891 _("(hidden)") : file_path('C', 'R'), 1086 tmp, 1087 gp.conf_fp); 1088 SH_FREE(tmp); 1089 } 1090 smsg = S_TRUE; 1091 #if defined(SH_WITH_SERVER) 1092 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R) 1093 SH_FREE(buffer); 1094 #endif 1095 #endif 1096 SL_RETURN(0, _("sh_gpg_check_sign")); 1097 } 1098 else 1099 { 1100 /* fp mismatch 1101 */ 1102 dlog(1, FIL__, __LINE__, 1103 _("The fingerprint of the signing key: %s\ndoes not match the compiled-in fingerprint: %s.\nTherefore the signature could not be verified.\n"), 1104 gp.conf_fp, SH_GPG_FP); 1105 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_E_SUBGEN, 1106 _("Fingerprint mismatch"), 1107 _("gpg_check_sign")); 1108 status = SH_GPG_BADSIGN; 1109 } 1110 #else 1111 if (smsg == S_FALSE) 1112 { 1113 tmp = sh_util_safe_name(gp.conf_id); 1114 sh_gpg_fill_startup (__LINE__, 1115 /* sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_START_GH, */ 1116 sh.prg_name, sh.real.uid, 1117 (sh.flag.hidefile == S_TRUE) ? 1118 _("(hidden)") : file_path('C', 'R'), 1119 tmp, 1120 gp.conf_fp); 892 tmp, sig_fp); 1121 893 SH_FREE(tmp); 1122 894 } 1123 895 smsg = S_TRUE; 1124 #if defined(SH_WITH_SERVER) 1125 #if defined( HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)896 897 #if defined(SH_WITH_SERVER) && defined(USE_GETPWNAM_R) 1126 898 SH_FREE(buffer); 1127 899 #endif 1128 #endif 900 1129 901 SL_RETURN(0, _("sh_gpg_check_sign")); 1130 #endif 1131 } 1132 1133 else if (SH_GPG_OK == status && (what == 2 || what == 0)) 1134 { 1135 if ((sl_strcmp(gp.data_id, gp.conf_id) == 0) && 1136 (sl_strcmp(gp.data_fp, gp.conf_fp) == 0)) 1137 { 1138 #if defined(SH_WITH_SERVER) 1139 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R) 1140 SH_FREE(buffer); 1141 #endif 1142 #endif 1143 SL_RETURN(0, _("sh_gpg_check_sign")); 1144 } 1145 else 1146 { 1147 /* ID or fp not equal 1148 */ 1149 dlog(1, FIL__, __LINE__, 1150 _("The fingerprint or ID of the signing key is not the same for the\nconfiguration file and the file signature database.\nTherefore the signature could not be verified.\n")); 1151 tmp = sh_util_safe_name (gp.conf_id); 1152 tmp2 = sh_util_safe_name (gp.data_id); 1153 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_START_GH2, 1154 sh.prg_name, sh.real.uid, 1155 (sh.flag.hidefile == S_TRUE) ? _("(hidden)") : file_path('C', 'R'), 1156 tmp, gp.conf_fp, 1157 (sh.flag.hidefile == S_TRUE) ? _("(hidden)") : file_path('D', 'R'), 1158 tmp2, gp.data_fp); 1159 SH_FREE(tmp); 1160 SH_FREE(tmp2); 1161 } 902 #endif /* !ifdef USE_FINGERPRINT */ 1162 903 } 1163 904 … … 1168 909 1169 910 #if defined(SH_WITH_SERVER) 1170 #if defined( HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R)911 #if defined(USE_GETPWNAM_R) 1171 912 struct passwd e_pwd; 1172 913 char * e_buffer = SH_ALLOC(SH_PWBUF_SIZE); … … 1186 927 dlog(1, FIL__, __LINE__, 1187 928 _("The signature of the configuration file or the file signature database\ncould not be verified. Possible reasons are:\n - gpg binary (%s) not found\n - invalid signature\n - the signature key is not in the private keyring of UID %d,\n - there is no keyring in %s/.gnupg, or\n - the file is not signed - did you move /filename.asc to /filename ?\nTo create a signed file, use (remove old signatures before):\n gpg -a --clearsign --not-dash-escaped FILE\n mv FILE.asc FILE\n"), 1188 #if defined(WITH_GPG)1189 929 DEFAULT_GPG_PATH, 1190 #else1191 DEFAULT_PGP_PATH,1192 #endif1193 930 (int) e_uid, e_home); 1194 931 1195 #if defined(SH_WITH_SERVER) 1196 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R) 932 #if defined(SH_WITH_SERVER) && defined(USE_GETPWNAM_R) 1197 933 SH_FREE(e_buffer); 1198 934 #endif 1199 #endif1200 935 } 1201 936 1202 937 TPT(((0), FIL__, __LINE__, _("msg=<Status = %d>\n"), status)); 1203 1204 sh_error_handle((-1), FIL__, __LINE__, status, MSG_EXIT_ABORT1, sh.prg_name);1205 aud_exit (FIL__, __LINE__, EXIT_FAILURE);1206 938 1207 939 return (-1); /* make compiler happy */ … … 1223 955 */ 1224 956 fdTmp = open_tmp(); 957 if (SL_ISERROR(fdTmp)) 958 { 959 dlog(1, FIL__, __LINE__, _("Error opening temporary file.\n")); 960 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_E_SUBGEN, 961 _("Error opening temporary file."), 962 _("sh_gpg_extract_signed")); 963 return -1; 964 } 1225 965 1226 966 fin_cp = fdopen(dup(get_the_fd(fd)), "rb"); -
trunk/src/sh_hash.c
r474 r481 20 20 #include "config_xor.h" 21 21 22 /* define this if you want version 1.3 style database file */23 /* #define OLD_BUG */24 25 /* make sure state changes of a file are always reported, even26 * with reportonlyonce=true27 */28 /* #define REPLACE_OLD *//* moved to samhain.h */29 30 22 #include <stdlib.h> 31 23 #include <string.h> … … 48 40 #endif 49 41 42 50 43 #if defined(SH_WITH_CLIENT) || defined(SH_STANDALONE) 51 44 45 #include "samhain.h" 46 #include "sh_utils.h" 47 #include "sh_unix.h" 48 #include "sh_dbIO_int.h" 49 #include "sh_dbIO.h" 52 50 #include "sh_hash.h" 53 #include "sh_utils.h"54 51 #include "sh_error.h" 55 52 #include "sh_tiger.h" … … 61 58 62 59 #if defined(SH_WITH_CLIENT) 63 #include "sh_ forward.h"60 #include "sh_xfer.h" 64 61 #endif 65 62 … … 71 68 #define FIL__ _("sh_hash.c") 72 69 73 SH_MUTEX_STATIC(mutex_hash,PTHREAD_MUTEX_INITIALIZER); 74 75 const char notalink[2] = { '-', '\0' }; 70 SH_MUTEX_INIT(mutex_hash,PTHREAD_MUTEX_INITIALIZER); 76 71 77 72 static char * all_items (file_type * theFile, char * fileHash, int is_new); 78 73 79 #define QUOTE_CHAR '=' 80 81 char * unquote_string (const char * str, size_t len) 82 { 83 int i = 0, t1, t2; 84 char * tmp = NULL; 85 size_t l2, j, k = 0; 86 87 SL_ENTER(_("unquote_string")); 88 89 if (str != NULL) 90 { 91 l2 = len - 2; 92 tmp = SH_ALLOC(len + 1); 93 94 for (j = 0; j <= len; ++j) 95 { 96 if (str[j] != QUOTE_CHAR) 97 { 98 tmp[k] = str[j]; 99 } 100 else if (str[j] == QUOTE_CHAR && j < l2) 101 { 102 t1 = sh_util_hexchar(str[j+1]); 103 t2 = sh_util_hexchar(str[j+2]); 104 if ((t1|t2) >= 0) 105 { 106 i = 16 * t1 + t2; 107 tmp[k] = i; 108 j += 2; 109 } 110 else 111 { 112 tmp[k] = str[j]; 113 } 114 } 115 else 116 tmp[k] = str[j]; 117 ++k; 118 } 119 } 120 SL_RETURN(tmp, _("unquote_string")); 121 } 122 123 124 static char * int2hex (unsigned char i, char * i2h) 125 { 126 static char hexchars[] = "0123456789ABCDEF"; 127 128 i2h[0] = hexchars[(((i) & 0xF0) >> 4)]; /* high */ 129 i2h[1] = hexchars[((i) & 0x0F)]; /* low */ 130 131 return i2h; 132 } 133 134 135 char * quote_string (const char * str, size_t len) 136 { 137 char * tmp; 138 char * tmp2; 139 size_t l2, j, i = 0, k = 0; 140 char i2h[2]; 141 142 SL_ENTER(_("quote_string")); 143 144 if (str == NULL) 145 { 146 SL_RETURN(NULL, _("quote_string")); 147 } 148 149 for (j = 0; j < len; ++j) 150 if (str[j] == '\n' || str[j] == QUOTE_CHAR) ++i; 151 152 l2 = len + 1; 153 if (sl_ok_muls(3, i) && sl_ok_adds(l2, (3*i))) 154 { 155 tmp = SH_ALLOC(len + 1 + 3*i); 156 } 157 else 158 { 159 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN, 160 _("integer overflow"), 161 _("quote_string")); 162 SL_RETURN(NULL, _("quote_string")); 163 } 164 165 for (j = 0; j <= len; ++j) 166 { 167 if (str[j] == '\n') 168 { 169 tmp2 = int2hex((unsigned char) '\n', i2h); /* was 'n', fixed in 1.5.4 */ 170 tmp[k] = QUOTE_CHAR; ++k; 171 tmp[k] = tmp2[0]; ++k; 172 tmp[k] = tmp2[1]; 173 } 174 else if (str[j] == QUOTE_CHAR) 175 { 176 tmp2 = int2hex((unsigned char) QUOTE_CHAR, i2h); 177 tmp[k] = QUOTE_CHAR; ++k; 178 tmp[k] = tmp2[0]; ++k; 179 tmp[k] = tmp2[1]; 180 } 181 else 182 { 183 tmp[k] = str[j]; 184 } 185 ++k; 186 } 187 SL_RETURN(tmp, _("quote_string")); 188 } 189 190 static UINT32 * swap_32 (UINT32 * iptr) 191 { 192 #ifdef WORDS_BIGENDIAN 193 unsigned char swap; 194 unsigned char * ii = (unsigned char *) iptr; 195 swap = ii[0]; ii[0] = ii[3]; ii[3] = swap; 196 swap = ii[1]; ii[1] = ii[2]; ii[2] = swap; 197 return iptr; 198 #else 199 return iptr; 200 #endif 201 } 202 203 static UINT64 * swap_64 (UINT64 * iptr) 204 { 205 #ifdef WORDS_BIGENDIAN 206 #ifdef UINT64_IS_32 207 swap_32 ((UINT32*) iptr); 208 #else 209 unsigned char swap; 210 unsigned char * ii = (unsigned char *) iptr; 211 swap = ii[0]; ii[0] = ii[7]; ii[7] = swap; 212 swap = ii[1]; ii[1] = ii[6]; ii[6] = swap; 213 swap = ii[2]; ii[2] = ii[5]; ii[5] = swap; 214 swap = ii[3]; ii[3] = ii[4]; ii[4] = swap; 215 #endif 216 return iptr; 217 #else 218 return iptr; 219 #endif 220 } 221 222 static unsigned short * swap_short (unsigned short * iptr) 223 { 224 #ifdef WORDS_BIGENDIAN 225 if (sizeof(short) == 4) 226 swap_32 ((UINT32*) iptr); 227 else 228 { 229 /* alignment problem */ 230 unsigned char swap; 231 static unsigned short ooop; 232 unsigned char * ii; 233 ooop = *iptr; 234 ii = (unsigned char *) &ooop; 235 /* printf("SWAP0: %hd %d\n", *iptr, sizeof(unsigned short)); */ 236 swap = ii[0]; ii[0] = ii[1]; ii[1] = swap; 237 /* printf("SWAP1: %hd\n", (unsigned short) ooop); */ 238 #ifndef OLD_BUG 239 return &ooop; 240 #endif 241 } 242 return iptr; 243 #else 244 return iptr; 245 #endif 246 } 247 248 249 typedef struct store_info { 250 251 UINT32 mode; 252 UINT32 linkmode; 253 254 UINT64 dev; 255 UINT64 rdev; 256 UINT32 hardlinks; 257 UINT32 ino; 258 UINT64 size; 259 UINT64 atime; 260 UINT64 mtime; 261 UINT64 ctime; 262 UINT32 owner; 263 UINT32 group; 264 265 #ifdef OLD_BUG 266 #if defined(__linux__) 267 UINT32 attributes; 268 char c_attributes[ATTRBUF_SIZE]; 269 #endif 270 #else 271 /* #if defined(__linux__) */ 272 UINT32 attributes; 273 char c_attributes[ATTRBUF_SIZE]; 274 /* endif */ 275 #endif 276 unsigned short mark; 277 char c_owner[USER_MAX+2]; 278 char c_group[GROUP_MAX+2]; 279 char c_mode[CMODE_SIZE]; 280 char checksum[KEY_LEN+1]; 281 } sh_filestore_t; 282 283 typedef struct file_info { 284 sh_filestore_t theFile; 285 char * fullpath; 286 char * linkpath; 287 char * attr_string; 288 int fflags; 289 unsigned long modi_mask; 290 struct file_info * next; 291 } sh_file_t; 292 293 static const char *policy[] = { 294 N_("[]"), 295 N_("[ReadOnly]"), 296 N_("[LogFiles]"), 297 N_("[GrowingLogs]"), 298 N_("[IgnoreNone]"), 299 N_("[IgnoreAll]"), 300 N_("[Attributes]"), 301 N_("[User0]"), 302 N_("[User1]"), 303 N_("[User2]"), 304 N_("[User3]"), 305 N_("[User4]"), 306 N_("[Prelink]"), 307 NULL 308 }; 74 static const char *policy[] = { 75 N_("[]"), 76 N_("[ReadOnly]"), 77 N_("[LogFiles]"), 78 N_("[GrowingLogs]"), 79 N_("[IgnoreNone]"), 80 N_("[IgnoreAll]"), 81 N_("[Attributes]"), 82 N_("[User0]"), 83 N_("[User1]"), 84 N_("[User2]"), 85 N_("[User3]"), 86 N_("[User4]"), 87 N_("[Prelink]"), 88 NULL 89 }; 90 91 static int report_checkflags = S_FALSE; 92 int set_report_checkflags(const char * c) 93 { 94 return sh_util_flagval(c, &report_checkflags); 95 } 96 int get_report_checkflags() 97 { 98 return report_checkflags; 99 } 100 101 309 102 310 103 const char * sh_hash_getpolicy(int class) … … 324 117 #include "sh_hash.h" 325 118 326 /* must fit an int */327 /* #define TABSIZE 2048 */328 #define TABSIZE 65536329 330 /* must fit an unsigned short */331 /* changed for V0.8, as the */332 /* database format has changed */333 334 /* changed again for V0.9 */335 /* #define REC_MAGIC 19 */336 /* changed again for V1.3 */337 #ifdef OLD_BUG338 #define REC_MAGIC 20339 #else340 /* changed again for V1.4 */341 #define REC_MAGIC 21342 #endif343 344 #define REC_FLAGS_ATTR (1<<8)345 #define REC_FLAGS_MASK 0xFF00346 119 347 120 /************************************************************** … … 350 123 * 351 124 **************************************************************/ 352 staticfile_type * sh_hash_create_ft (const sh_file_t * p, char * fileHash)125 file_type * sh_hash_create_ft (const sh_file_t * p, char * fileHash) 353 126 { 354 127 file_type * theFile; … … 391 164 theFile->dev = p->theFile.dev; 392 165 theFile->hardlinks = p->theFile.hardlinks; 166 theFile->check_flags = p->theFile.checkflags; 393 167 394 168 if (p->attr_string) … … 408 182 static int hashsearch_prev (const char * s, struct two_sh_file_t * a, int * index); 409 183 184 185 /************************************************************** 186 * 187 * >>>> The internal database <<< 188 * 189 **************************************************************/ 190 410 191 static sh_file_t * tab[TABSIZE]; 192 193 sh_file_t ** get_default_data_table() 194 { 195 return tab; 196 } 411 197 412 198 /************************************************************** … … 499 285 if (p->linkpath) 500 286 { 501 if (p->linkpath != notalink) 502 SH_FREE(p->linkpath); 287 SH_FREE(p->linkpath); 503 288 p->linkpath = NULL; 504 289 } … … 521 306 char fileHash[KEY_LEN + 1]; 522 307 file_type * theFile; 523 524 308 char * str; 525 526 309 527 310 SL_ENTER(_("hash_unvisited")); … … 552 335 if (((!SH_FFLAG_VISITED_SET(p->fflags)) || SH_FFLAG_CHECKED_SET(p->fflags)) 553 336 && (!SH_FFLAG_REPORTED_SET(p->fflags)) 554 && (!SH_FFLAG_ALLIGNORE_SET(p->fflags)))337 /* && (!SH_FFLAG_ALLIGNORE_SET(p->fflags)) */) 555 338 { 556 339 i = retry_lstat(FIL__, __LINE__, p->fullpath, &buf); … … 565 348 /* If any of the parent directories is under IgnoreAll 566 349 */ 567 if ( 0 != sh_files_is_allignore(ptr))350 if ((0 != sh_files_is_allignore(ptr)) || SH_FFLAG_ALLIGNORE_SET(p->fflags)) 568 351 level = ShDFLevel[SH_LEVEL_ALLIGNORE]; 569 352 SH_FREE(ptr); … … 599 382 (S_TRUE == sh.flag.update && S_TRUE == sh_util_ask_update(p->fullpath))) 600 383 { 601 #ifdef REPLACE_OLD602 384 /* Remove the old entry 603 385 */ … … 610 392 611 393 SL_RET0(_("hash_unvisited")); 612 #else613 SET_SH_FFLAG_REPORTED(p->fflags);614 #endif615 394 } 616 395 } … … 679 458 * 680 459 *********************************************************************/ 681 void sh_hash_remove (const char * path)460 void sh_hash_remove_unconditional (const char * path) 682 461 { 683 462 struct two_sh_file_t entries; 684 463 int index; 685 464 465 SL_ENTER(_("sh_hash_remove_unconditional")); 466 467 SH_MUTEX_LOCK(mutex_hash); 468 if (0 == hashsearch_prev (path, &entries, &index)) 469 { 470 sh_file_t * p = entries.this; 471 472 /* Remove the old entry 473 */ 474 if (entries.prev == p) 475 tab[index] = p->next; 476 else 477 entries.prev->next = p->next; 478 479 delete_db_entry(p); 480 } 481 SH_MUTEX_UNLOCK(mutex_hash); 482 483 SL_RET0(_("sh_hash_remove_unconditional")); 484 } 485 486 void sh_hash_remove (const char * path) 487 { 686 488 SL_ENTER(_("sh_hash_remove")); 687 688 SH_MUTEX_LOCK(mutex_hash);689 489 690 490 if ((sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) || 691 491 (S_TRUE == sh.flag.update && S_TRUE == sh_util_ask_update(path))) 692 492 { 693 if (0 == hashsearch_prev (path, &entries, &index)) 694 { 695 sh_file_t * p = entries.this; 696 #ifdef REPLACE_OLD 697 /* Remove the old entry 698 */ 699 if (entries.prev == p) 700 tab[index] = p->next; 701 else 702 entries.prev->next = p->next; 703 704 delete_db_entry(p); 705 706 goto end; 707 #else 708 SET_SH_FFLAG_REPORTED(p->fflags); 709 #endif 710 } 711 } 712 713 end: 714 ; /* 'label at end of compound statement' */ 715 SH_MUTEX_UNLOCK(mutex_hash); 716 493 sh_hash_remove_unconditional (path); 494 } 717 495 SL_RET0(_("sh_hash_remove")); 718 496 } … … 811 589 if (p->linkpath) 812 590 { 813 if (p->linkpath != notalink) 814 SH_FREE(p->linkpath); 591 SH_FREE(p->linkpath); 815 592 p->linkpath = NULL; 816 593 } … … 856 633 { 857 634 *index = hashfunc(s); 858 859 this = tab[*index]; 860 861 prev = this; 635 this = tab[*index]; 636 prev = this; 862 637 863 638 if (this) 864 639 { 865 640 do { 866 867 641 if ((this->fullpath != NULL) && (0 == strcmp(s, this->fullpath))) 868 642 { 869 643 a->prev = prev; 870 a->this = this; 871 644 a->this = this; 872 645 SL_RETURN( 0, _("hashsearch_prev")); 873 646 } 874 875 647 prev = this; 876 648 this = this->next; 877 878 649 } while(this); 879 650 } … … 888 659 * 889 660 ***********************************************************************/ 890 static void hashinsert (sh_file_t * s)661 void hashinsert (sh_file_t * mtab[TABSIZE], sh_file_t * s) 891 662 { 892 663 sh_file_t * p; … … 898 669 key = hashfunc(s->fullpath); 899 670 900 if ( tab[key] == NULL)901 { 902 tab[key] = s;903 tab[key]->next = NULL;671 if (mtab[key] == NULL) 672 { 673 mtab[key] = s; 674 mtab[key]->next = NULL; 904 675 SL_RET0(_("hashinsert")); 905 676 } 906 677 else 907 678 { 908 p = tab[key];679 p = mtab[key]; 909 680 while (1) 910 681 { 911 if (p && p->fullpath && 912 0 == strcmp(s->fullpath, p->fullpath)) 682 if (p && p->fullpath && 0 == strcmp(s->fullpath, p->fullpath)) 913 683 { 914 684 q = p->next; 915 685 SH_FREE(p->fullpath); 916 if(p->linkpath && p->linkpath != notalink) 917 SH_FREE(p->linkpath); 918 if(p->attr_string) 919 SH_FREE(p->attr_string); 686 if(p->linkpath) SH_FREE(p->linkpath); 687 if(p->attr_string) SH_FREE(p->attr_string); 920 688 memcpy(p, s, sizeof(sh_file_t)); 921 689 p->next = q; 922 SH_FREE(s); 923 s = NULL; 690 SH_FREE(s); s = NULL; 924 691 SL_RET0(_("hashinsert")); 925 692 } … … 940 707 941 708 709 942 710 /****************************************************************** 943 711 * 944 * Get a single line712 * ------- Check functions ------- 945 713 * 946 714 ******************************************************************/ 947 static FILE * sh_fin_fd = NULL; 948 949 static int sh_hash_getline (FILE * fd, char * line, int sizeofline) 950 { 951 register int n = 0; 952 char * res; 953 954 if (sizeofline < 2) { 955 if (sizeofline > 0) line[0] = '\0'; 956 return 0; 957 } 958 res = fgets(line, sizeofline, fd); 959 if (res == NULL) 960 { 961 line[0] = '\0'; 962 return -1; 963 } 964 n = strlen(line); 965 if (n > 0) { 966 --n; 967 line[n] = '\0'; /* remove terminating '\n' */ 968 } 969 return n; 970 } 971 972 static void sh_hash_getline_end (void) 973 { 974 sl_fclose (FIL__, __LINE__, sh_fin_fd); 975 sh_fin_fd = NULL; 715 716 static int IsInit = 0; 717 718 void sh_hash_set_initialized() 719 { 720 IsInit = 1; 976 721 return; 977 722 } 978 723 979 /****************************************************************** 980 * 981 * ------- Check functions ------- 982 * 983 ******************************************************************/ 984 985 static int IsInit = 0; 986 987 988 /****************************************************************** 989 * 990 * Fast forward to start of data 991 * 992 ******************************************************************/ 993 int sh_hash_setdataent (SL_TICKET fd, char * line, int size, const char * file) 994 { 995 long i; 996 extern int get_the_fd (SL_TICKET ticket); 997 998 SL_ENTER(_("sh_hash_setdataent")); 999 1000 sl_rewind (fd); 1001 1002 if (sh_fin_fd != NULL) 1003 { 1004 sl_fclose (FIL__, __LINE__, sh_fin_fd); 1005 sh_fin_fd = NULL; 1006 } 1007 1008 sh_fin_fd = fdopen(dup(get_the_fd(fd)), "rb"); 1009 if (!sh_fin_fd) 1010 { 1011 dlog(1, FIL__, __LINE__, 1012 _("The file signature database: %s is not readable.\n"), 1013 (NULL == file) ? _("(null)") : file); 1014 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_P_NODATA, 1015 ( (NULL == file) ? _("(null)") : file) 1016 ); 1017 aud_exit (FIL__, __LINE__, EXIT_FAILURE); 1018 } 1019 1020 while (1) 1021 { 1022 i = sh_hash_getline (sh_fin_fd, line, size); 1023 if (i < 0 ) 1024 { 1025 SH_FREE(line); 1026 dlog(1, FIL__, __LINE__, 1027 _("The file signature database: %s does not\ncontain any data, or the start-of-file marker is missing (unlikely,\nunless modified by hand).\n"), 1028 (NULL == file) ? _("(null)") : file); 1029 1030 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_P_NODATA, 1031 ( (NULL == file) ? _("(null)") : file) 1032 ); 1033 aud_exit (FIL__, __LINE__, EXIT_FAILURE); 1034 } 1035 1036 #if defined(SH_STEALTH) 1037 if (0 == sl_strncmp (line, N_("[SOF]"), 5)) 1038 #else 1039 if (0 == sl_strncmp (line, _("[SOF]"), 5)) 1040 #endif 1041 break; 1042 } 1043 SL_RETURN( 1, _("sh_hash_setdataent")); 1044 } 1045 1046 static int sh_hash_setdataent_old (SL_TICKET fd, char * line, int size, 1047 char * file) 1048 { 1049 long i; 1050 1051 SL_ENTER(_("sh_hash_setdataent_old")); 1052 1053 sl_rewind (fd); 1054 1055 while (1) 1056 { 1057 i = sh_unix_getline (fd, line, size-1); 1058 if (i < 0 ) 1059 { 1060 SH_FREE(line); 1061 dlog(1, FIL__, __LINE__, 1062 _("The file signature database: %s does not\ncontain any data, or the start-of-file marker is missing (unlikely,\nunless modified by hand).\n"), 1063 (NULL == file) ? _("(null)") : file); 1064 1065 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_P_NODATA, 1066 ( (NULL == file) ? _("(null)") : file) 1067 ); 1068 aud_exit (FIL__, __LINE__, EXIT_FAILURE); 1069 } 1070 1071 #if defined(SH_STEALTH) 1072 if (0 == sl_strncmp (line, N_("[SOF]"), 5)) 1073 #else 1074 if (0 == sl_strncmp (line, _("[SOF]"), 5)) 1075 #endif 1076 break; 1077 } 1078 SL_RETURN( 1, _("sh_hash_setdataent_old")); 1079 } 1080 1081 /****************************************************************** 1082 * 1083 * Read next record 1084 * 1085 ******************************************************************/ 1086 sh_file_t * sh_hash_getdataent (SL_TICKET fd, char * line, int size) 1087 { 1088 sh_file_t * p; 1089 sh_filestore_t ft; 1090 long i; 1091 size_t len; 1092 char * fullpath; 1093 char * linkpath; 1094 char * attr_string = NULL; 1095 char * tmp; 1096 1097 SL_ENTER(_("sh_hash_getdataent")); 1098 1099 (void) fd; 1100 1101 /* Read next record -- Part One 1102 */ 1103 p = SH_ALLOC(sizeof(sh_file_t)); 1104 1105 i = fread (&ft, sizeof(sh_filestore_t), 1, sh_fin_fd); 1106 /* i = sl_read(fd, &ft, sizeof(sh_filestore_t)); */ 1107 /* if ( SL_ISERROR(i) || i == 0) */ 1108 if (i < 1) 1109 { 1110 SH_FREE(p); 1111 SL_RETURN( NULL, _("sh_hash_getdataent")); 1112 } 1113 1114 swap_32(&(ft.mode)); 1115 swap_32(&(ft.linkmode)); 1116 swap_64(&(ft.dev)); 1117 swap_64(&(ft.rdev)); 1118 swap_32(&(ft.hardlinks)); 1119 swap_32(&(ft.ino)); 1120 swap_64(&(ft.size)); 1121 swap_64(&(ft.atime)); 1122 swap_64(&(ft.mtime)); 1123 swap_64(&(ft.ctime)); 1124 swap_32(&(ft.owner)); 1125 swap_32(&(ft.group)); 1126 #if defined(__linux__) || defined(HAVE_STAT_FLAGS) 1127 swap_32(&(ft.attributes)); 1128 #endif 1129 #ifdef OLD_BUG 1130 swap_short(&(ft.mark)); 1131 #else 1132 ft.mark = *(swap_short(&(ft.mark))); 1133 #endif 1134 1135 if ((ft.mark & ~REC_FLAGS_MASK) != REC_MAGIC) 1136 { 1137 SH_FREE(p); 1138 SL_RETURN( NULL, _("sh_hash_getdataent")); 1139 } 1140 1141 /* Read next record -- Part Two -- Fullpath 1142 */ 1143 i = sh_hash_getline (sh_fin_fd, line, size); 1144 if (i <= 0 ) 1145 { 1146 SH_FREE(line); 1147 SH_FREE(p); 1148 dlog(1, FIL__, __LINE__, 1149 _("There is a corrupt record in the file signature database: %s\nThe file path is missing.\n"), 1150 (NULL == file_path('D', 'R'))? _("(null)"):file_path('D', 'R')); 1151 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_P_NODATA, 1152 ( (NULL == file_path('D', 'R')) ? _("(null)") : 1153 file_path('D', 'R')) 1154 ); 1155 aud_exit (FIL__, __LINE__,EXIT_FAILURE); 1156 } 1157 1158 tmp = unquote_string (line, i); 1159 len = sl_strlen(tmp)+1; 1160 fullpath = SH_ALLOC(len); 1161 (void) sl_strlcpy (fullpath, tmp, len); 1162 if (tmp) 1163 SH_FREE(tmp); 1164 if (fullpath[len-2] == '\n') 1165 fullpath[len-2] = '\0'; 1166 1167 /* Read next record -- Part Three -- Linkpath 1168 */ 1169 i = sh_hash_getline (sh_fin_fd, line, size); 1170 if (i <= 0 ) 1171 { 1172 SH_FREE(line); 1173 SH_FREE(fullpath); 1174 SH_FREE(p); 1175 dlog(1, FIL__, __LINE__, 1176 _("There is a corrupt record in the file signature database: %s\nThe link path (or its placeholder) is missing.\n"), 1177 (NULL == file_path('D', 'R'))? _("(null)"):file_path('D', 'R')); 1178 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_P_NODATA, 1179 ( (NULL == file_path('D', 'R')) ? _("(null)") : 1180 file_path('D', 'R')) 1181 ); 1182 aud_exit (FIL__, __LINE__,EXIT_FAILURE); 1183 } 1184 1185 tmp = unquote_string (line, i); 1186 1187 if ( tmp && tmp[0] == '-' && 1188 (tmp[1] == '\0' || (tmp[1] == '\n' && tmp[2] == '\0'))) 1189 { 1190 linkpath = (char *)notalink; 1191 } 1192 else 1193 { 1194 len = sl_strlen(tmp); 1195 linkpath = sh_util_strdup_l(tmp, len); 1196 if (len > 0 && linkpath[len-1] == '\n') 1197 linkpath[len-1] = '\0'; 1198 } 1199 1200 if (tmp) 1201 SH_FREE(tmp); 1202 1203 /* Read next record -- Part Four -- attr_string 1204 */ 1205 if ((ft.mark & REC_FLAGS_ATTR) != 0) 1206 { 1207 i = sh_hash_getline (sh_fin_fd, line, size); 1208 if (i <= 0 ) 1209 { 1210 SH_FREE(line); 1211 SH_FREE(fullpath); 1212 if (linkpath != notalink) 1213 SH_FREE(linkpath); 1214 SH_FREE(p); 1215 dlog(1, FIL__, __LINE__, 1216 _("There is a corrupt record in the file signature database: %s\nThe attribute string is missing.\n"), 1217 (NULL == file_path('D', 'R'))? _("(null)"):file_path('D', 'R')); 1218 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_P_NODATA, 1219 ( (NULL == file_path('D', 'R')) ? _("(null)") : 1220 file_path('D', 'R')) 1221 ); 1222 aud_exit (FIL__, __LINE__,EXIT_FAILURE); 1223 } 1224 1225 tmp = unquote_string (line, i); 1226 1227 len = sl_strlen(tmp)+1; 1228 attr_string = SH_ALLOC(len); 1229 (void) sl_strlcpy (attr_string, tmp, len); 1230 if (tmp) 1231 SH_FREE(tmp); 1232 if (attr_string[len-2] == '\n') 1233 attr_string[len-2] = '\0'; 1234 } 1235 1236 /* Read next record -- Part Four -- Decode 1237 */ 1238 #if defined(SH_STEALTH) 1239 sh_do_decode(fullpath, sl_strlen(fullpath)); 1240 1241 #if defined(__linux__) || defined(HAVE_STAT_FLAGS) 1242 sh_do_decode(ft.c_attributes, sl_strlen(ft.c_attributes)); 1243 #endif 1244 1245 sh_do_decode(ft.c_mode, sl_strlen(ft.c_mode)); 1246 sh_do_decode(ft.c_owner, sl_strlen(ft.c_owner)); 1247 sh_do_decode(ft.c_group, sl_strlen(ft.c_group)); 1248 sh_do_decode(ft.checksum, sl_strlen(ft.checksum)); 1249 1250 /* TXT entries are c_mode[0] != 'l' and do not get decoded 1251 */ 1252 if (ft.c_mode[0] == 'l' && linkpath != notalink) 1253 { 1254 sh_do_decode(linkpath, sl_strlen(linkpath)); 1255 } 1256 1257 if ((ft.mark & REC_FLAGS_ATTR) != 0) 1258 { 1259 sh_do_decode(attr_string, sl_strlen(attr_string)); 1260 } 1261 #endif 1262 1263 memcpy( &(*p).theFile, &ft, sizeof(sh_filestore_t) ); 1264 1265 /* init fflags, such that suid files in 1266 * database are recognized as such 1267 */ 1268 { 1269 mode_t mode = (mode_t) ft.mode; 1270 1271 if (S_ISREG(mode) && 1272 (0 !=(S_ISUID & mode) || 1273 #if defined(HOST_IS_LINUX) 1274 (0 !=(S_ISGID & mode) && 1275 0 !=(S_IXGRP & mode)) 1276 #else 1277 0 !=(S_ISGID & mode) 1278 #endif 1279 ) 1280 ) 1281 p->fflags = SH_FFLAG_SUIDCHK; 1282 1283 else 1284 p->fflags = 0; 1285 } 1286 1287 p->modi_mask = 0L; 1288 p->fullpath = fullpath; 1289 p->linkpath = linkpath; 1290 1291 p->attr_string = attr_string; 1292 1293 /* set to an invalid value 1294 */ 1295 ft.mark = (REC_MAGIC + 5); 1296 1297 SL_RETURN( p, _("sh_hash_getdataent")); 1298 } 724 int sh_hash_get_initialized() 725 { 726 return IsInit; 727 } 728 1299 729 1300 730 /****************************************************************** … … 1305 735 void sh_hash_init () 1306 736 { 1307 1308 #define FGETS_BUF 163841309 1310 sh_file_t * p;1311 SL_TICKET fd;1312 long i;1313 int count = 0;1314 char * line = NULL;1315 1316 #if defined(WITH_GPG) || defined(WITH_PGP)1317 extern int get_the_fd (SL_TICKET ticket);1318 1319 SL_TICKET fdTmp = (-1);1320 #endif1321 char hashbuf[KEYBUF_SIZE];1322 1323 737 volatile int retval = 0; 1324 738 volatile int exitval = EXIT_SUCCESS; … … 1341 755 } 1342 756 1343 fd = (-1);1344 1345 #if defined(SH_WITH_CLIENT)1346 1347 /* Data file from Server1348 */1349 1350 if (fd == (-1) && 0 == sl_strcmp(file_path('D', 'R'), _("REQ_FROM_SERVER")))1351 {1352 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_D_DSTART);1353 fd = sh_forward_req_file(_("DATA"));1354 if (SL_ISERROR(fd))1355 {1356 dlog(1, FIL__, __LINE__,1357 _("Could not retrieve the file signature database from the server(errnum = %ld).\nPossible reasons include:\n - the server is not running,\n - session key negotiation failed (see the manual for proper setup), or\n - the server cannot access the file.\n"), fd);1358 sh_error_handle ((-1), FIL__, __LINE__, fd, MSG_EXIT_ABORT1,1359 sh.prg_name);1360 retval = 1; exitval = EXIT_FAILURE;1361 goto unlock_and_return;1362 }1363 sl_rewind (fd);1364 1365 sl_strlcpy (sh.data.hash,1366 sh_tiger_hash (file_path('D', 'R'),1367 fd, TIGER_NOLIM, hashbuf, sizeof(hashbuf)),1368 KEY_LEN+1);1369 sl_rewind (fd);1370 }1371 else1372 #endif1373 /* Local data file1374 */1375 1376 if (fd == (-1))1377 {1378 if ( SL_ISERROR(fd = sl_open_read(FIL__, __LINE__,1379 file_path('D', 'R'), SL_YESPRIV)))1380 {1381 TPT(( 0, FIL__, __LINE__, _("msg=<Error opening: %s>\n"),1382 file_path('D', 'R')));1383 dlog(1, FIL__, __LINE__,1384 _("Could not open the local file signature database for reading because\nof the following error: %s (errnum = %ld)\nIf this is a permission problem, you need to change file permissions\nto make the file readable for the effective UID: %d\n"),1385 sl_get_errmsg(), fd, (int) sl_ret_euid());1386 sh_error_handle ((-1), FIL__, __LINE__, fd, MSG_EXIT_ABORT1,1387 sh.prg_name);1388 retval = 1; exitval = EXIT_FAILURE;1389 goto unlock_and_return;1390 }1391 1392 TPT(( 0, FIL__, __LINE__, _("msg=<Opened database: %s>\n"),1393 file_path('D', 'R')));1394 1395 if (0 != sl_strncmp(sh.data.hash,1396 sh_tiger_hash (file_path('D', 'R'), fd, TIGER_NOLIM,1397 hashbuf, sizeof(hashbuf)),1398 KEY_LEN)1399 && sh.flag.checkSum != SH_CHECK_INIT)1400 {1401 dlog(1, FIL__, __LINE__,1402 _("The checksum of the file signature database has changed since startup: %s -> %s\n"),1403 sh.data.hash, sh_tiger_hash (file_path('D', 'R'), fd, TIGER_NOLIM,1404 hashbuf, sizeof(hashbuf)));1405 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_E_AUTH,1406 ( (NULL == file_path('D', 'R')) ? _("(null)") :1407 file_path('D', 'R') )1408 );1409 retval = 1; exitval = EXIT_FAILURE;1410 goto unlock_and_return;1411 }1412 sl_rewind (fd);1413 1414 } /* new 1.4.8 */1415 1416 if (sig_termfast == 1) /* SIGTERM */1417 {1418 TPT((0, FIL__, __LINE__, _("msg=<Terminate.>\n")));1419 --sig_raised; --sig_urgent;1420 retval = 1; exitval = EXIT_SUCCESS;1421 goto unlock_and_return;1422 }1423 1424 #if defined(WITH_GPG) || defined(WITH_PGP)1425 1426 /* extract the data and copy to temporary file1427 */1428 fdTmp = sh_gpg_extract_signed(fd);1429 1430 if (sig_termfast == 1) /* SIGTERM */1431 {1432 TPT((0, FIL__, __LINE__, _("msg=<Terminate.>\n")));1433 --sig_raised; --sig_urgent;1434 retval = 1; exitval = EXIT_SUCCESS;1435 goto unlock_and_return;1436 }1437 1438 sl_close(fd);1439 fd = fdTmp;1440 1441 /* Validate signature of open file.1442 */1443 if (0 != sh_gpg_check_sign (0, fd, 2))1444 {1445 retval = 1; exitval = EXIT_FAILURE;1446 goto unlock_and_return;1447 }1448 sl_rewind (fd);1449 #endif1450 1451 line = SH_ALLOC(MAX_PATH_STORE+2);1452 1453 /* fast forward to start of data1454 */1455 sh_hash_setdataent(fd, line, MAX_PATH_STORE+1, file_path('D', 'R'));1456 1457 for (i = 0; i < TABSIZE; ++i)1458 tab[i] = NULL;1459 1460 while (1)1461 {1462 if (sig_termfast == 1) /* SIGTERM */1463 {1464 TPT((0, FIL__, __LINE__, _("msg=<Terminate.>\n")));1465 --sig_raised; --sig_urgent;1466 retval = 1; exitval = EXIT_SUCCESS;1467 SH_FREE(line);1468 line = NULL;1469 goto unlock_and_return;1470 }1471 1472 p = sh_hash_getdataent (fd, line, MAX_PATH_STORE+1);1473 if (p != NULL)1474 {1475 hashinsert (p);1476 ++count;1477 }1478 else1479 break;1480 }1481 1482 757 /* Initialization completed. 1483 758 */ 1484 IsInit = 1; 1485 1486 if (line != NULL) 1487 SH_FREE(line); 1488 1489 /* Always keep db in memory, so we have no open file 1490 */ 1491 sl_close (fd); 1492 sh_hash_getline_end(); 1493 /* fd = -1; */ 759 retval = sh_dbIO_load_db(tab); 760 761 if (0 == retval) 762 IsInit = 1; 763 else 764 exitval = EXIT_FAILURE; 1494 765 1495 766 unlock_and_return: … … 1500 771 SL_RET0(_("sh_hash_init")); 1501 772 } 773 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_EXIT_ABORT1, sh.prg_name); 1502 774 aud_exit (FIL__, __LINE__, exitval); 775 } 776 777 void sh_hash_init_and_checksum() 778 { 779 TPT((0, FIL__, __LINE__, _("msg=<Get checksum of the database.>\n"))) 780 if (sh.flag.checkSum == SH_CHECK_CHECK) 781 { 782 if (0 != sl_strcmp(file_path('D', 'R'), _("REQ_FROM_SERVER"))) 783 { 784 char hashbuf[KEYBUF_SIZE]; 785 (void) sl_strlcpy(sh.data.hash, 786 sh_tiger_hash (file_path('D', 'R'), 787 TIGER_FILE, TIGER_NOLIM, 788 hashbuf, sizeof(hashbuf)), 789 KEY_LEN+1); 790 } 791 792 /* this eventually fetches the file from server to get checksum 793 */ 794 sh_hash_init (); 795 } 796 return; 1503 797 } 1504 798 … … 1536 830 } 1537 831 1538 /******************************************************************1539 *1540 * Insert a file into the database.1541 *1542 ******************************************************************/1543 static int pushdata_isfirst = 1;1544 static SL_TICKET pushdata_fd = -1;1545 1546 static int pushdata_stdout = S_FALSE;1547 1548 static char * sh_db_version_string = NULL;1549 1550 int sh_hash_pushdata_stdout (const char * str)1551 {1552 if (!str)1553 { pushdata_stdout = S_TRUE; return 0; }1554 return -1;1555 }1556 1557 int sh_hash_version_string(const char * str)1558 {1559 if (str)1560 {1561 if (sh_db_version_string != NULL) {1562 SH_FREE(sh_db_version_string);1563 }1564 if (0 == sl_strncmp(str, _("NULL"), 4))1565 {1566 sh_db_version_string = NULL;1567 return 0;1568 }1569 sh_db_version_string = sh_util_strdup(str);1570 return 0;1571 }1572 return -1;1573 }1574 1575 832 static int sh_loosedircheck = S_FALSE; 1576 833 … … 1581 838 1582 839 1583 static void sh_hash_pushdata_int (file_type * buf, char * fileHash)1584 {1585 static long p_count = 0;1586 1587 int status = 0;1588 1589 char * tmp;1590 size_t tmp_len = 0;1591 size_t old_len = 0;1592 size_t path_len = 0;1593 1594 sh_filestore_t p;1595 1596 struct stat sbuf;1597 1598 char * fullpath = NULL;1599 char * linkpath = NULL;1600 char * attr_string = NULL;1601 1602 char * line = NULL;1603 1604 char timestring[81];1605 1606 #if !defined(__linux__) && !defined(HAVE_STAT_FLAGS)1607 int i;1608 #endif1609 1610 SL_ENTER(_("sh_hash_pushdata_int"));1611 1612 fullpath = SH_ALLOC(MAX_PATH_STORE+1);1613 linkpath = SH_ALLOC(MAX_PATH_STORE+1);1614 1615 linkpath[0] = '-';1616 linkpath[1] = '\0';1617 fullpath[0] = '-';1618 fullpath[1] = '\0';1619 1620 if (!buf) {1621 memset(&p, '\0', sizeof(sh_filestore_t));1622 }1623 1624 if ((pushdata_stdout == S_TRUE) && (sh.flag.update == S_TRUE))1625 {1626 dlog(1, FIL__, __LINE__,1627 _("You cannot write the database to stdout when you use update rather than init.\n"));1628 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_EXIT_ABORTS,1629 _("Writing database to stdout with update"),1630 sh.prg_name,1631 _("sh_hash_pushdata_int"));1632 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1633 }1634 1635 if ((pushdata_stdout == S_TRUE) && (sl_is_suid()))1636 {1637 dlog(1, FIL__, __LINE__,1638 _("You cannot write the database to stdout when running with suid privileges.\n"));1639 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_EXIT_ABORTS,1640 _("Writing database to stdout when suid"),1641 sh.prg_name,1642 _("sh_hash_pushdata_int"));1643 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1644 }1645 1646 1647 if ((pushdata_isfirst == 1) && (pushdata_stdout == S_FALSE) &&1648 ( (NULL == file_path('D', 'W')) ||1649 (0 == sl_strcmp(file_path('D', 'W'), _("REQ_FROM_SERVER"))) ))1650 {1651 dlog(1, FIL__, __LINE__,1652 _("You need to configure a local path for initializing the database\nlike ./configure --with-data-file=REQ_FROM_SERVER/some/local/path\n"));1653 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_EXIT_ABORTS,1654 _("No local path for database specified"),1655 sh.prg_name,1656 _("sh_hash_pushdata_int"));1657 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1658 }1659 1660 1661 if ((pushdata_isfirst == 1) && (pushdata_stdout == S_FALSE))1662 {1663 /* Warn that file already exists; file_path != NULL here because1664 * checked above1665 */1666 if (0 == retry_lstat(FIL__, __LINE__, file_path('D', 'W'), &sbuf))1667 {1668 if (sh.flag.update == S_FALSE)1669 {1670 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_FI_DBEX,1671 file_path('D', 'W'));1672 }1673 }1674 }1675 1676 1677 if (sh.flag.update == S_FALSE)1678 {1679 if (pushdata_stdout == S_FALSE && pushdata_fd == -1)1680 {1681 if ( SL_ISERROR(pushdata_fd = sl_open_write(FIL__, __LINE__,1682 file_path('D', 'W'),1683 SL_YESPRIV)))1684 {1685 SH_FREE(fullpath);1686 SH_FREE(linkpath);1687 sh_error_handle((-1), FIL__, __LINE__, pushdata_fd, MSG_E_ACCESS,1688 geteuid(), file_path('D', 'W'));1689 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1690 }1691 1692 if (SL_ISERROR(status = sl_lock (pushdata_fd)))1693 {1694 SH_FREE(fullpath);1695 SH_FREE(linkpath);1696 sh_error_handle((-1), FIL__, __LINE__, status, MSG_E_SUBGPATH,1697 _("Failed to lock baseline database"), _("sh_hash_pushdata_int"),1698 file_path('D', 'W'));1699 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1700 }1701 1702 if ( SL_ISERROR(status = sl_forward(pushdata_fd)))1703 {1704 SH_FREE(fullpath);1705 SH_FREE(linkpath);1706 sh_error_handle((-1), FIL__, __LINE__, status, MSG_E_SUBGPATH,1707 _("Failed to seek to end of baseline database"),1708 _("sh_hash_pushdata_int"),1709 file_path('D', 'W'));1710 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1711 }1712 }1713 }1714 else /* update == TRUE */1715 {1716 if (pushdata_isfirst == 1)1717 {1718 TPT((0, FIL__, __LINE__, _("msg=<Update.>\n")))1719 if ( SL_ISERROR(pushdata_fd = sl_open_rdwr(FIL__, __LINE__,1720 file_path('D', 'W'),1721 SL_YESPRIV))){1722 SH_FREE(fullpath);1723 SH_FREE(linkpath);1724 sh_error_handle((-1), FIL__, __LINE__, pushdata_fd, MSG_E_ACCESS,1725 geteuid(), file_path('D', 'W'));1726 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1727 }1728 1729 if (SL_ISERROR(status = sl_lock (pushdata_fd)))1730 {1731 SH_FREE(fullpath);1732 SH_FREE(linkpath);1733 sh_error_handle((-1), FIL__, __LINE__, status, MSG_E_SUBGPATH,1734 _("Failed to lock baseline database"), _("sh_hash_pushdata_int"),1735 file_path('D', 'W'));1736 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1737 }1738 1739 line = SH_ALLOC(MAX_PATH_STORE+1);1740 if (SL_ISERROR(sh_hash_setdataent_old (pushdata_fd, line,1741 MAX_PATH_STORE,1742 file_path('D', 'W'))))1743 {1744 SH_FREE(fullpath);1745 SH_FREE(linkpath);1746 SH_FREE(line);1747 aud_exit(FIL__, __LINE__, EXIT_FAILURE);1748 }1749 SH_FREE(line);1750 }1751 }1752 1753 if (buf != NULL) {1754 1755 old_len = sl_strlen(buf->fullpath);1756 #if defined(SH_STEALTH)1757 sh_do_encode(buf->fullpath, old_len);1758 #endif1759 tmp = quote_string(buf->fullpath, old_len);1760 tmp_len = sl_strlen(tmp);1761 #if defined(SH_STEALTH)1762 sh_do_decode(buf->fullpath, old_len);1763 #endif1764 1765 if (tmp && tmp_len <= MAX_PATH_STORE)1766 {1767 sl_strlcpy(fullpath, buf->fullpath, MAX_PATH_STORE+1);1768 }1769 else1770 {1771 char hashbuf[KEYBUF_SIZE];1772 1773 sl_strlcpy(fullpath,1774 sh_tiger_hash (buf->fullpath,1775 TIGER_DATA, old_len,1776 hashbuf, sizeof(hashbuf)),1777 KEY_LEN+1);1778 }1779 if (tmp) SH_FREE(tmp);1780 }1781 1782 path_len = sl_strlen(fullpath);1783 #if defined(SH_STEALTH)1784 sh_do_encode(fullpath, path_len);1785 #endif1786 1787 tmp = quote_string(fullpath, path_len);1788 if (tmp) {1789 sl_strlcpy(fullpath, tmp, MAX_PATH_STORE+1);1790 SH_FREE(tmp);1791 }1792 1793 /* NOTE: TXT entries are c_mode[0] != 'l' and do not get decoded1794 */1795 if (buf != NULL /* && buf->c_mode[0] == 'l' */ && buf->link_path != NULL)1796 {1797 1798 old_len = sl_strlen(buf->link_path);1799 #if defined(SH_STEALTH)1800 if (buf->c_mode[0] == 'l')1801 sh_do_encode(buf->link_path, old_len);1802 #endif1803 tmp = quote_string(buf->link_path, old_len);1804 tmp_len = sl_strlen(tmp);1805 #if defined(SH_STEALTH)1806 if (buf->c_mode[0] == 'l')1807 sh_do_decode(buf->link_path, old_len);1808 #endif1809 1810 if (tmp && tmp_len <= MAX_PATH_STORE)1811 {1812 sl_strlcpy(linkpath, buf->link_path, MAX_PATH_STORE+1);1813 }1814 else1815 {1816 char hashbuf[KEYBUF_SIZE];1817 sl_strlcpy(linkpath,1818 sh_tiger_hash (buf->link_path,1819 TIGER_DATA, old_len,1820 hashbuf, sizeof(hashbuf)),1821 KEY_LEN+1);1822 }1823 if (tmp) SH_FREE(tmp);1824 1825 path_len = sl_strlen(linkpath);1826 #if defined(SH_STEALTH)1827 if (buf->c_mode[0] == 'l')1828 sh_do_encode(linkpath, path_len);1829 #endif1830 tmp = quote_string(linkpath, path_len);1831 if (tmp)1832 {1833 sl_strlcpy(linkpath, tmp, MAX_PATH_STORE+1);1834 SH_FREE(tmp);1835 }1836 }1837 1838 if (buf != NULL && buf->attr_string != NULL)1839 {1840 old_len = sl_strlen(buf->attr_string);1841 #if defined(SH_STEALTH)1842 sh_do_encode(buf->attr_string, old_len);1843 #endif1844 tmp = quote_string(buf->attr_string, old_len);1845 if (tmp)1846 {1847 attr_string = tmp;1848 tmp = NULL;1849 }1850 #if defined(SH_STEALTH)1851 sh_do_decode(buf->attr_string, old_len);1852 #endif1853 }1854 1855 1856 if (buf != NULL) {1857 p.mark = REC_MAGIC;1858 if (attr_string)1859 p.mark |= REC_FLAGS_ATTR;1860 sl_strlcpy(p.c_mode, buf->c_mode, CMODE_SIZE);1861 sl_strlcpy(p.c_group, buf->c_group, GROUP_MAX+1);1862 sl_strlcpy(p.c_owner, buf->c_owner, USER_MAX+1);1863 if (fileHash) {1864 sl_strlcpy(p.checksum, fileHash, KEY_LEN+1);1865 }1866 #if defined(__linux__) || defined(HAVE_STAT_FLAGS)1867 sl_strlcpy(p.c_attributes, buf->c_attributes, ATTRBUF_SIZE);1868 #else1869 for (i = 0; i < ATTRBUF_USED; ++i) p.c_attributes[i] = '-';1870 p.c_attributes[ATTRBUF_USED] = '\0';1871 #endif1872 1873 #if defined(SH_STEALTH)1874 sh_do_encode(p.c_mode, sl_strlen(p.c_mode));1875 sh_do_encode(p.c_owner, sl_strlen(p.c_owner));1876 sh_do_encode(p.c_group, sl_strlen(p.c_group));1877 sh_do_encode(p.checksum, sl_strlen(p.checksum));1878 1879 sh_do_encode(p.c_attributes, sl_strlen(p.c_attributes));1880 #endif1881 1882 #if defined(__linux__) || defined(HAVE_STAT_FLAGS)1883 p.attributes = (UINT32) buf->attributes;1884 #else1885 p.attributes = 0;1886 #endif1887 p.linkmode = (UINT32) buf->linkmode;1888 p.hardlinks = (UINT32) buf->hardlinks;1889 p.dev = (UINT64) buf->dev;1890 p.rdev = (UINT64) buf->rdev;1891 p.mode = (UINT32) buf->mode;1892 p.ino = (UINT32) buf->ino;1893 p.size = (UINT64) buf->size;1894 p.mtime = (UINT64) buf->mtime;1895 p.atime = (UINT64) buf->atime;1896 p.ctime = (UINT64) buf->ctime;1897 p.owner = (UINT32) buf->owner;1898 p.group = (UINT32) buf->group;1899 1900 swap_32(&(p.mode));1901 swap_32(&(p.linkmode));1902 swap_64(&(p.dev));1903 swap_64(&(p.rdev));1904 swap_32(&(p.hardlinks));1905 swap_32(&(p.ino));1906 swap_64(&(p.size));1907 swap_64(&(p.atime));1908 swap_64(&(p.mtime));1909 swap_64(&(p.ctime));1910 swap_32(&(p.owner));1911 swap_32(&(p.group));1912 swap_32(&(p.attributes));1913 1914 #ifdef OLD_BUG1915 swap_short(&(p.mark));1916 #else1917 p.mark = *(swap_short(&(p.mark)));1918 #endif1919 }1920 1921 /* write the start marker1922 */1923 if (pushdata_isfirst == 1)1924 {1925 if (sh.flag.update == S_FALSE)1926 {1927 if (sh_db_version_string != NULL)1928 {1929 if (pushdata_stdout == S_FALSE)1930 {1931 sl_write (pushdata_fd, _("\n#Host "), 7);1932 sl_write (pushdata_fd, sh.host.name,1933 sl_strlen(sh.host.name));1934 sl_write (pushdata_fd, _(" Version "), 9);1935 sl_write (pushdata_fd, sh_db_version_string,1936 sl_strlen(sh_db_version_string));1937 sl_write (pushdata_fd, _(" Date "), 6);1938 (void) sh_unix_time(0, timestring, sizeof(timestring));1939 sl_write (pushdata_fd, timestring, strlen(timestring));1940 sl_write (pushdata_fd, "\n", 1);1941 } else {1942 printf ("%s",_("\n#Host "));1943 printf ("%s", sh.host.name);1944 printf ("%s",_(" Version "));1945 printf ("%s", sh_db_version_string);1946 printf ("%s",_(" Date "));1947 (void) sh_unix_time(0, timestring, sizeof(timestring));1948 printf ("%s\n", timestring);1949 }1950 }1951 1952 if (pushdata_stdout == S_FALSE)1953 {1954 #if defined(SH_STEALTH)1955 sl_write (pushdata_fd, "\n", 1);1956 sl_write_line (pushdata_fd, N_("[SOF]"), 5);1957 #else1958 sl_write_line (pushdata_fd, _("\n[SOF]"), 6);1959 #endif1960 }1961 else1962 {1963 #if defined(SH_STEALTH)1964 printf ("\n%s\n", N_("[SOF]"));1965 #else1966 printf ("%s\n", _("\n[SOF]"));1967 #endif1968 }1969 }1970 pushdata_isfirst = 0;1971 }1972 1973 if (pushdata_stdout == S_FALSE)1974 {1975 sl_write (pushdata_fd, &p, sizeof(sh_filestore_t));1976 sl_write_line_fast (pushdata_fd, fullpath, sl_strlen(fullpath));1977 sl_write_line_fast (pushdata_fd, linkpath, sl_strlen(linkpath));1978 if (attr_string)1979 sl_write_line_fast (pushdata_fd, attr_string, sl_strlen(attr_string));1980 } else {1981 if (fwrite (&p, sizeof(sh_filestore_t), 1, stdout))1982 {1983 printf ("%s\n", fullpath);1984 printf ("%s\n", linkpath);1985 if (attr_string)1986 printf ("%s\n", attr_string);1987 }1988 else1989 {1990 perror(_("Error writing database"));1991 aud_exit (FIL__, __LINE__, EXIT_FAILURE);1992 }1993 }1994 1995 ++p_count;1996 1997 if ((sh.flag.update != S_TRUE) && (pushdata_stdout == S_FALSE))1998 {1999 if (sh.flag.checkSum != SH_CHECK_INIT || (buf == NULL && fileHash == NULL))2000 {2001 sl_close (pushdata_fd);2002 pushdata_fd = -1;2003 }2004 }2005 2006 SH_FREE(fullpath);2007 SH_FREE(linkpath);2008 if (attr_string)2009 SH_FREE(attr_string);2010 2011 SL_RET0(_("sh_hash_pushdata_int"));2012 }2013 2014 SH_MUTEX_STATIC(mutex_writeout,PTHREAD_MUTEX_INITIALIZER);2015 2016 void sh_hash_pushdata (file_type * buf, char * fileHash)2017 {2018 SH_MUTEX_LOCK(mutex_writeout);2019 sh_hash_pushdata_int (buf, fileHash);2020 SH_MUTEX_UNLOCK(mutex_writeout);2021 return;2022 }2023 2024 2025 int sh_hash_writeout()2026 {2027 sh_file_t * p;2028 int i;2029 file_type * f;2030 char fileHash[KEY_LEN + 1];2031 2032 SL_ENTER(_("sh_hash_writeout"));2033 2034 if (S_TRUE == file_is_remote())2035 {2036 sh_error_handle((-1), FIL__, __LINE__, S_FALSE, MSG_E_SUBGEN,2037 _("Baseline database is remote"), _("sh_hash_writeout"));2038 SL_RETURN (1, _("sh_hash_writeout"));2039 }2040 2041 SH_MUTEX_LOCK(mutex_writeout);2042 if (!SL_ISERROR(pushdata_fd))2043 {2044 sl_close(pushdata_fd);2045 pushdata_fd = -1;2046 }2047 pushdata_isfirst = 1;2048 2049 2050 SH_MUTEX_LOCK(mutex_hash);2051 for (i = 0; i < TABSIZE; ++i)2052 {2053 for (p = tab[i]; p; p = p->next)2054 {2055 f = sh_hash_create_ft (p, fileHash);2056 sh_hash_pushdata_int (f, fileHash);2057 if (f->attr_string) SH_FREE(f->attr_string);2058 if (f->link_path) SH_FREE(f->link_path);2059 SH_FREE(f);2060 }2061 }2062 SH_MUTEX_UNLOCK(mutex_hash);2063 2064 if (!SL_ISERROR(pushdata_fd))2065 {2066 sl_close(pushdata_fd);2067 pushdata_fd = -1;2068 }2069 pushdata_isfirst = 1;2070 SH_MUTEX_UNLOCK(mutex_writeout);2071 2072 SL_RETURN (0, _("sh_hash_writeout"));2073 }2074 840 2075 841 … … 2378 1144 sl_strlcpy(tmpFile->c_group, _("root"), 5); 2379 1145 1146 tmpFile->check_flags = 0; 1147 2380 1148 if ((str != NULL) && (size < (PATH_MAX/2)-1)) 2381 1149 { … … 2404 1172 2405 1173 if (sh.flag.checkSum == SH_CHECK_INIT) 2406 sh_ hash_pushdata(tmpFile,2407 1174 sh_dbIO_data_write (tmpFile, 1175 (save->checksum[0] == '\0') ? SH_KEY_NULL : save->checksum); 2408 1176 else 2409 1177 sh_hash_pushdata_memory (tmpFile, … … 2524 1292 p.group = (UINT32) buf->group; 2525 1293 1294 p.checkflags = (UINT32) buf->check_flags; 1295 2526 1296 memcpy( &(*fp).theFile, &p, sizeof(sh_filestore_t) ); 2527 1297 fp->fflags = 0; /* init fflags */ … … 2623 1393 msg[0] = '\0'; 2624 1394 1395 if (report_checkflags != S_FALSE) 1396 { 1397 if (is_new) 1398 format = _("checkflags_new=\"0%lo\" "); 1399 else 1400 format = _("checkflags_old=\"0%lo\" "); 1401 sl_snprintf(tmp, SH_MSG_BUF, format, 1402 (unsigned long) theFile->check_flags); 1403 sl_strlcat(msg, tmp, SH_MSG_BUF); 1404 } 2625 1405 2626 1406 #if defined(__linux__) || defined(HAVE_STAT_FLAGS) … … 2790 1570 msg[0] = '\0'; 2791 1571 1572 if (report_checkflags == S_TRUE) 1573 { 1574 if (is_new) 1575 format = _("checkflags_new=<0%lo> "); 1576 else 1577 format = _("checkflags_old=<0%lo> "); 1578 sl_snprintf(tmp, SH_MSG_BUF, format, 1579 (unsigned long) theFile->check_flags); 1580 sl_strlcat(msg, tmp, SH_MSG_BUF); 1581 } 1582 2792 1583 2793 1584 #if defined(__linux__) || defined(HAVE_STAT_FLAGS) … … 2952 1743 { 2953 1744 SH_MUTEX_LOCK(mutex_hash); 2954 hashinsert ( p);2955 p->modi_mask = theFile->check_ mask;1745 hashinsert (tab, p); 1746 p->modi_mask = theFile->check_flags; 2956 1747 SH_MUTEX_UNLOCK(mutex_hash); 2957 1748 } … … 2960 1751 } 2961 1752 1753 int sh_hash_is_null_file(file_type * theFile) 1754 { 1755 if (theFile->hardlinks == SH_DEADFILE && theFile->mode == 0 && 1756 theFile->ino == 0 && theFile->ctime == 0) 1757 { 1758 return S_TRUE; 1759 } 1760 return S_FALSE; 1761 } 1762 1763 int sh_hash_is_null_record(sh_filestore_t * theFile) 1764 { 1765 if (theFile->hardlinks == SH_DEADFILE && theFile->mode == 0 && 1766 theFile->ino == 0 && theFile->ctime == 0) 1767 { 1768 return S_TRUE; 1769 } 1770 return S_FALSE; 1771 } 1772 1773 void sh_hash_insert_null(char * str) 1774 { 1775 file_type theFile = { 0, 0, {'\0'}, 0, 0, 0, 0, 0, 1776 #if defined(__linux__) || defined(HAVE_STAT_FLAGS) 1777 0, {'\0'}, 1778 #endif 1779 {'\0'}, 0, {'\0'}, 0, {'\0'}, 1780 0, 0, 0, 0, 0, 0, 0, NULL, 0, {'\0'}, 0, NULL 1781 }; /* clang compiler bails out on standard conforming init with just {0} */ 1782 char fileHash[KEY_LEN+1]; 1783 char hashbuf[KEYBUF_SIZE]; 1784 1785 sl_strlcpy(fileHash, SH_KEY_NULL, sizeof(fileHash)); 1786 theFile.hardlinks = SH_DEADFILE; 1787 1788 if (sl_strlen(str) < PATH_MAX) 1789 sl_strlcpy(theFile.fullpath, str, PATH_MAX); 1790 else 1791 sl_strlcpy(theFile.fullpath, 1792 sh_tiger_hash(str, TIGER_DATA, sl_strlen(str), 1793 hashbuf, sizeof(hashbuf)), 1794 PATH_MAX); 1795 1796 sh_hash_pushdata_memory(&theFile, fileHash); 1797 return; 1798 } 1799 1800 static int handle_notfound(int log_severity, int class, 1801 file_type * theFile, char * fileHash) 1802 { 1803 sh_file_t * p; 1804 int retval = 0; 1805 1806 if (S_FALSE == sh_ignore_chk_new(theFile->fullpath)) 1807 { 1808 char * tmp = sh_util_safe_name(theFile->fullpath); 1809 char * str; 1810 1811 sh_files_fixup_mask(class, &(theFile->check_flags)); 1812 str = all_items (theFile, fileHash, 1); 1813 1814 sh_error_handle (log_severity, FIL__, __LINE__, 0, 1815 MSG_FI_ADD2, 1816 tmp, str); 1817 ++sh.statistics.files_report; 1818 SH_FREE(str); 1819 SH_FREE(tmp); 1820 } 1821 1822 if (sh.flag.reportonce == S_TRUE) 1823 SET_SH_FFLAG_REPORTED(theFile->file_reported); 1824 1825 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 1826 { 1827 p = sh_hash_push_int(theFile, fileHash); 1828 if (p) 1829 { 1830 hashinsert (tab, p); 1831 p->modi_mask = theFile->check_flags; 1832 p->theFile.checkflags = p->modi_mask; 1833 } 1834 } 1835 1836 else if (S_TRUE == sh.flag.update) 1837 { 1838 if (S_TRUE == sh_util_ask_update (theFile->fullpath)) 1839 { 1840 p = sh_hash_push_int(theFile, fileHash); 1841 if (p) 1842 { 1843 hashinsert (tab, p); 1844 p->modi_mask = theFile->check_flags; 1845 p->theFile.checkflags = p->modi_mask; 1846 } 1847 } 1848 else 1849 retval = 1; 1850 } 1851 return retval; 1852 } 2962 1853 2963 1854 /***************************************************************** … … 2975 1866 char * tmp_lnk; 2976 1867 char * tmp_lnk_old; 2977 2978 char * str;2979 1868 2980 1869 char timstr1c[32]; … … 2996 1885 volatile int log_severity; 2997 1886 char hashbuf[KEYBUF_SIZE]; 1887 struct { 1888 unsigned long oldflags; 1889 unsigned long newflags; 1890 } cf_report; 2998 1891 2999 1892 int retval; … … 3033 1926 if (p == NULL) 3034 1927 { 3035 if (S_FALSE == sh_ignore_chk_new(theFile->fullpath)) 3036 { 3037 tmp = sh_util_safe_name(theFile->fullpath); 3038 3039 str = all_items (theFile, fileHash, 1); 3040 sh_error_handle (log_severity, FIL__, __LINE__, 0, 3041 MSG_FI_ADD2, 3042 tmp, str); 3043 ++sh.statistics.files_report; 3044 SH_FREE(str); 3045 3046 SH_FREE(tmp); 3047 } 3048 3049 if (sh.flag.reportonce == S_TRUE) 3050 SET_SH_FFLAG_REPORTED(theFile->file_reported); 3051 3052 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3053 { 3054 p = sh_hash_push_int(theFile, fileHash); 3055 if (p) 3056 { 3057 hashinsert (p); 3058 p->modi_mask = theFile->check_mask; 3059 } 3060 } 3061 3062 else if (S_TRUE == sh.flag.update) 3063 { 3064 if (S_TRUE == sh_util_ask_update (theFile->fullpath)) 3065 { 3066 p = sh_hash_push_int(theFile, fileHash); 3067 if (p) 3068 { 3069 hashinsert (p); 3070 p->modi_mask = theFile->check_mask; 3071 } 3072 } 3073 else 3074 { 3075 retval = 1; 3076 goto unlock_and_return; 3077 } 3078 } 3079 1928 retval = handle_notfound(log_severity, class, theFile, fileHash); 3080 1929 goto unlock_and_return; 3081 1930 } … … 3086 1935 if (S_TRUE == sh_ignore_chk_mod(theFile->fullpath)) 3087 1936 { 1937 MODI_SET(theFile->check_flags, MODI_NOCHECK); 1938 p->modi_mask = theFile->check_flags; 1939 p->theFile.checkflags = p->modi_mask; 3088 1940 goto unlock_and_return; 3089 1941 } 3090 1942 3091 p->modi_mask = theFile->check_mask; 1943 cf_report.oldflags = p->theFile.checkflags; 1944 cf_report.newflags = theFile->check_flags; 1945 1946 p->modi_mask = theFile->check_flags; 1947 p->theFile.checkflags = p->modi_mask; 3092 1948 3093 1949 /* initialize change_code */ … … 3101 1957 if ( (fileHash != NULL) && 3102 1958 (strncmp (fileHash, p->theFile.checksum, KEY_LEN) != 0) && 3103 (theFile->check_ mask& MODI_CHK) != 0)3104 { 3105 if ((theFile->check_ mask& MODI_SGROW) == 0)1959 (theFile->check_flags & MODI_CHK) != 0) 1960 { 1961 if ((theFile->check_flags & MODI_SGROW) == 0) 3106 1962 { 3107 1963 modi_mask |= MODI_CHK; … … 3114 1970 { 3115 1971 if (S_FALSE == sh_check_rotated_log (theFile->fullpath, (UINT64) p->theFile.size, 3116 (UINT64) p->theFile.ino, p->theFile.checksum)) 1972 (UINT64) p->theFile.ino, p->theFile.checksum, 1973 p->theFile.checkflags)) 3117 1974 { 3118 1975 modi_mask |= MODI_CHK; … … 3139 1996 { 3140 1997 if (!(theFile->link_path) && 3141 (theFile->check_ mask& MODI_LNK) != 0)1998 (theFile->check_flags & MODI_LNK) != 0) 3142 1999 { 3143 2000 linkComp = NULL; … … 3166 2023 3167 2024 if ( sl_strncmp (linkComp, p->linkpath, maxcomp) != 0 && 3168 (theFile->check_ mask& MODI_LNK) != 0)2025 (theFile->check_flags & MODI_LNK) != 0) 3169 2026 { 3170 2027 modi_mask |= MODI_LNK; … … 3179 2036 if ( ( major(theFile->rdev) != major((dev_t)p->theFile.rdev) || 3180 2037 minor(theFile->rdev) != minor((dev_t)p->theFile.rdev) ) && 3181 (theFile->check_ mask& MODI_RDEV) != 0)2038 (theFile->check_flags & MODI_RDEV) != 0) 3182 2039 { 3183 2040 modi_mask |= MODI_RDEV; … … 3190 2047 */ 3191 2048 if ( (UINT32) theFile->ino != (UINT32) p->theFile.ino && 3192 (theFile->check_ mask& MODI_INO) != 0)2049 (theFile->check_flags & MODI_INO) != 0) 3193 2050 { 3194 2051 modi_mask |= MODI_INO; … … 3198 2055 3199 2056 if ( theFile->hardlinks != (nlink_t) p->theFile.hardlinks && 3200 (theFile->check_ mask& MODI_HLN) != 0)2057 (theFile->check_flags & MODI_HLN) != 0) 3201 2058 { 3202 2059 modi_mask |= MODI_HLN; … … 3220 2077 #endif 3221 2078 ) 3222 && (theFile->check_ mask& MODI_MOD) != 0)2079 && (theFile->check_flags & MODI_MOD) != 0) 3223 2080 { 3224 2081 modi_mask |= MODI_MOD; … … 3228 2085 * report link path if switch link/no link 3229 2086 */ 3230 if ((theFile->check_ mask& MODI_LNK) != 0 &&2087 if ((theFile->check_flags & MODI_LNK) != 0 && 3231 2088 (theFile->c_mode[0] != p->theFile.c_mode[0]) && 3232 2089 (theFile->c_mode[0] == 'l' || p->theFile.c_mode[0] == 'l')) … … 3239 2096 3240 2097 if ( theFile->owner != (uid_t) p->theFile.owner && 3241 (theFile->check_ mask& MODI_USR) != 0)2098 (theFile->check_flags & MODI_USR) != 0) 3242 2099 { 3243 2100 modi_mask |= MODI_USR; … … 3247 2104 3248 2105 if ( theFile->group != (gid_t) p->theFile.group && 3249 (theFile->check_ mask& MODI_GRP) != 0)2106 (theFile->check_flags & MODI_GRP) != 0) 3250 2107 { 3251 2108 modi_mask |= MODI_GRP; … … 3256 2113 3257 2114 if ( theFile->mtime != (time_t) p->theFile.mtime && 3258 (theFile->check_ mask& MODI_MTM) != 0)2115 (theFile->check_flags & MODI_MTM) != 0) 3259 2116 { 3260 2117 modi_mask |= MODI_MTM; … … 3263 2120 } 3264 2121 3265 if ( (theFile->check_ mask& MODI_ATM) != 0 &&2122 if ( (theFile->check_flags & MODI_ATM) != 0 && 3266 2123 theFile->atime != (time_t) p->theFile.atime) 3267 2124 { … … 3276 2133 */ 3277 2134 if ( theFile->ctime != (time_t) p->theFile.ctime && 3278 (theFile->check_ mask& MODI_CTM) != 0)2135 (theFile->check_flags & MODI_CTM) != 0) 3279 2136 { 3280 2137 modi_mask |= MODI_CTM; … … 3284 2141 3285 2142 if ( theFile->size != (off_t) p->theFile.size && 3286 (theFile->check_ mask& MODI_SIZ) != 0)3287 { 3288 if ((theFile->check_ mask& MODI_SGROW) == 0 ||2143 (theFile->check_flags & MODI_SIZ) != 0) 2144 { 2145 if ((theFile->check_flags & MODI_SGROW) == 0 || 3289 2146 theFile->size < (off_t) p->theFile.size) 3290 2147 { … … 3309 2166 if (modi_mask != 0 && sh.flag.fulldetail == S_TRUE) 3310 2167 { 3311 if ((theFile->check_ mask& MODI_ATM) == 0)2168 if ((theFile->check_flags & MODI_ATM) == 0) 3312 2169 modi_mask = MASK_READONLY_; 3313 2170 else … … 3322 2179 msg = SH_ALLOC(SH_MSG_BUF); 3323 2180 msg[0] = '\0'; 2181 2182 sh_files_fixup_mask(class, &(cf_report.newflags)); 2183 2184 if ( (report_checkflags != S_FALSE) && (cf_report.oldflags != cf_report.newflags)) 2185 { 2186 sl_snprintf(tmp, SH_MSG_BUF, 2187 #ifdef SH_USE_XML 2188 _("checkflags_old=\"0%lo\" checkflags_new=\"0%lo\" "), 2189 #else 2190 _("checkflags_old=<0%lo>, checkflags_new=<0%lo>, "), 2191 #endif 2192 cf_report.oldflags, cf_report.newflags); 2193 sl_strlcat(msg, tmp, SH_MSG_BUF); 2194 } 3324 2195 3325 2196 if ( ((modi_mask & MODI_MOD) != 0) … … 3374 2245 #endif 3375 2246 3376 #ifdef REPLACE_OLD3377 2247 if ((modi_mask & MODI_MOD) != 0) 3378 2248 { … … 3405 2275 } 3406 2276 } 3407 #endif 2277 3408 2278 } 3409 2279 … … 3419 2289 (unsigned long) theFile->hardlinks); 3420 2290 sl_strlcat(msg, tmp, SH_MSG_BUF); 3421 #ifdef REPLACE_OLD 2291 3422 2292 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3423 2293 p->theFile.hardlinks = theFile->hardlinks; 3424 #endif3425 2294 } 3426 2295 … … 3443 2312 ); 3444 2313 sl_strlcat(msg, tmp, SH_MSG_BUF); 3445 #ifdef REPLACE_OLD 2314 3446 2315 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3447 2316 p->theFile.rdev = theFile->rdev; 3448 #endif3449 2317 } 3450 2318 … … 3460 2328 (unsigned long) theFile->ino); 3461 2329 sl_strlcat(msg, tmp, SH_MSG_BUF); 3462 #ifdef REPLACE_OLD 2330 3463 2331 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3464 2332 { … … 3466 2334 p->theFile.dev = theFile->dev; 3467 2335 } 3468 #endif3469 2336 } 3470 2337 … … 3488 2355 ); 3489 2356 sl_strlcat(msg, tmp, SH_MSG_BUF); 3490 #ifdef REPLACE_OLD 2357 3491 2358 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3492 2359 p->theFile.dev = theFile->dev; 3493 #endif3494 2360 } 3495 2361 #endif … … 3512 2378 ); 3513 2379 sl_strlcat(msg, tmp, SH_MSG_BUF); 3514 #ifdef REPLACE_OLD 2380 3515 2381 if ((modi_mask & MODI_USR) != 0) { 3516 2382 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) … … 3520 2386 } 3521 2387 } 3522 #endif3523 2388 } 3524 2389 … … 3542 2407 3543 2408 sl_strlcat(msg, tmp, SH_MSG_BUF); 3544 #ifdef REPLACE_OLD 2409 3545 2410 if ((modi_mask & MODI_GRP) != 0) { 3546 2411 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) … … 3550 2415 } 3551 2416 } 3552 #endif3553 2417 } 3554 2418 … … 3559 2423 (UINT64) theFile->size); 3560 2424 sl_strlcat(msg, tmp, SH_MSG_BUF); 3561 #ifdef REPLACE_OLD 2425 3562 2426 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3563 2427 p->theFile.size = theFile->size; 3564 #endif3565 2428 } 3566 2429 … … 3577 2440 #endif 3578 2441 sl_strlcat(msg, tmp, SH_MSG_BUF); 3579 #ifdef REPLACE_OLD 2442 3580 2443 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3581 2444 p->theFile.ctime = theFile->ctime; 3582 #endif3583 2445 } 3584 2446 … … 3595 2457 #endif 3596 2458 sl_strlcat(msg, tmp, SH_MSG_BUF); 3597 #ifdef REPLACE_OLD 2459 3598 2460 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3599 2461 p->theFile.atime = theFile->atime; 3600 #endif3601 2462 } 3602 2463 … … 3613 2474 #endif 3614 2475 sl_strlcat(msg, tmp, SH_MSG_BUF); 3615 #ifdef REPLACE_OLD 2476 3616 2477 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3617 2478 p->theFile.mtime = theFile->mtime; 3618 #endif3619 2479 } 3620 2480 … … 3630 2490 p->theFile.checksum, fileHash); 3631 2491 sl_strlcat(msg, tmp, SH_MSG_BUF); 3632 #ifdef REPLACE_OLD 2492 3633 2493 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3634 2494 { 3635 2495 sl_strlcpy(p->theFile.checksum, fileHash, KEY_LEN+1); 3636 if ((theFile->check_ mask& MODI_SGROW) != 0)2496 if ((theFile->check_flags & MODI_SGROW) != 0) 3637 2497 p->theFile.size = theFile->size; 3638 2498 } 3639 #endif 3640 /* FIXME is this correct? */ 2499 2500 3641 2501 if (theFile->c_mode[0] != 'l' && theFile->link_path && 3642 2502 strlen(theFile->link_path) > 2) … … 3665 2525 SH_FREE(tmp_lnk_old); 3666 2526 sl_strlcat(msg, tmp, SH_MSG_BUF); 3667 #ifdef REPLACE_OLD 2527 3668 2528 if (sh.flag.reportonce == S_TRUE && sh.flag.update == S_FALSE) 3669 2529 { 3670 if (p->linkpath != NULL && p->linkpath != notalink)2530 if (p->linkpath != NULL) 3671 2531 SH_FREE(p->linkpath); 3672 if (!(theFile->link_path) || 3673 (theFile->link_path[0] == '-' && theFile->link_path[1] == '\0')) 3674 p->linkpath = (char *)notalink; 2532 if (!(theFile->link_path)) 2533 p->linkpath = sh_util_strdup("-"); 3675 2534 else 3676 2535 p->linkpath = sh_util_strdup(theFile->link_path); 3677 2536 } 3678 #endif 3679 } 3680 3681 if (MODI_AUDIT_ENABLED(theFile->check_mask)) 2537 } 2538 2539 if (MODI_AUDIT_ENABLED(theFile->check_flags)) 3682 2540 { 3683 2541 char result[256]; … … 3701 2559 } 3702 2560 2561 /**************************************************** 2562 * 2563 * REPORT on file change 2564 * 2565 ****************************************************/ 3703 2566 tmp_path = sh_util_safe_name(theFile->fullpath); 3704 2567 sh_error_handle(log_severity, FIL__, __LINE__, … … 3711 2574 SH_FREE(tmp); 3712 2575 SH_FREE(msg); 3713 3714 #ifndef REPLACE_OLD3715 SET_SH_FFLAG_REPORTED(p->fflags);3716 #endif3717 2576 3718 2577 if (S_TRUE == sh.flag.update) … … 3757 2616 if (theFile->link_path) 3758 2617 SH_FREE(theFile->link_path); 3759 if (p->linkpath && p->linkpath != notalink)2618 if (p->linkpath) 3760 2619 theFile->link_path = sh_util_strdup(p->linkpath); 3761 2620 else … … 3815 2674 if (theFile->c_mode[0] == 'l' || theFile->link_path) 3816 2675 { 3817 if (p->linkpath != NULL && p->linkpath != notalink)2676 if (p->linkpath != NULL) 3818 2677 SH_FREE(p->linkpath); 3819 2678 p->linkpath = sh_util_strdup(theFile->link_path); … … 3821 2680 else 3822 2681 { 3823 if (p->linkpath != NULL && p->linkpath != notalink) {2682 if (p->linkpath != NULL) 3824 2683 SH_FREE(p->linkpath); 3825 } 3826 p->linkpath = (char *)notalink; 2684 p->linkpath = sh_util_strdup("-"); 3827 2685 } 3828 2686 … … 3955 2813 { 3956 2814 /* if (0 == strncmp(s, p->fullpath, len_s)) *//* old */ 3957 if (S_TRUE == hash_remove_tree_test(s, p->fullpath, len_s)) 2815 if (S_TRUE == hash_remove_tree_test(s, p->fullpath, len_s)) { 3958 2816 SET_SH_FFLAG_ALLIGNORE(p->fflags); 2817 MODI_SET(p->theFile.checkflags, MODI_ALLIGNORE); 2818 } 3959 2819 } /* if path is not null */ 3960 2820 … … 3984 2844 ListFile = sh_util_strdup(c); 3985 2845 return 0; 2846 } 2847 char * get_list_file() 2848 { 2849 return ListFile; 3986 2850 } 3987 2851 … … 4231 3095 time_t now = time(NULL); 4232 3096 time_t then = (time_t) p->theFile.mtime; 3097 struct tm * time_ptr; 4233 3098 4234 3099 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GMTIME_R) 4235 struct tm * time_ptr;4236 3100 struct tm time_tm; 4237 3101 #endif 3102 3103 if (ListFullDetail != S_FALSE) 3104 { 3105 sh_hash_list_db_entry_full_detail (p); 3106 return; 3107 } 3108 3109 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GMTIME_R) 4238 3110 time_ptr = gmtime_r(&then, &time_tm); 3111 if (!time_ptr) 3112 return; 4239 3113 strftime(thetime, 127, _("%b %d %Y"), time_ptr); 4240 3114 time_ptr = gmtime_r(&now, &time_tm); 3115 if (!time_ptr) 3116 return; 4241 3117 strftime(nowtime, 127, _("%b %d %Y"), time_ptr); 4242 3118 if (0 == strncmp(&nowtime[7], &thetime[7], 4)) 4243 3119 { 4244 3120 time_ptr = gmtime_r(&then, &time_tm); 3121 if (!time_ptr) 3122 return; 4245 3123 strftime(thetime, 127, _("%b %d %H:%M"), time_ptr); 4246 3124 } 4247 3125 #else 4248 strftime(thetime, 127, _("%b %d %Y"), gmtime(&then)); 4249 strftime(nowtime, 127, _("%b %d %Y"), gmtime(&now)); 3126 time_ptr = gmtime(&then); 3127 if (!time_ptr) 3128 return; 3129 strftime(thetime, 127, _("%b %d %Y"), time_ptr); 3130 time_ptr = gmtime(&now); 3131 if (!time_ptr) 3132 return; 3133 strftime(nowtime, 127, _("%b %d %Y"), time_ptr); 4250 3134 if (0 == strncmp(&nowtime[7], &thetime[7], 4)) 4251 strftime(thetime, 127, _("%b %d %H:%M"), gmtime(&then)); 3135 { 3136 time_ptr = gmtime(&then); 3137 if (!time_ptr) 3138 return; 3139 strftime(thetime, 127, _("%b %d %H:%M"), time_ptr); 3140 } 4252 3141 #endif 4253 3142 … … 4327 3216 } 4328 3217 4329 int sh_hash_list_db (const char * db_file)4330 {4331 sh_file_t * p;4332 SL_TICKET fd;4333 char * line;4334 int flag = 0;4335 4336 if (!db_file)4337 {4338 _exit(EXIT_FAILURE);4339 return -1;4340 }4341 if (sl_is_suid())4342 {4343 fprintf(stderr, "%s",_("ERROR: insufficient privilege\n"));4344 _exit (EXIT_FAILURE);4345 return -1; /* for Mac OSX compiler */4346 }4347 if (0 == strcmp(db_file, _("default")))4348 db_file = file_path('D', 'W');4349 if (!db_file)4350 {4351 _exit(EXIT_FAILURE);4352 return -1;4353 }4354 4355 line = SH_ALLOC(MAX_PATH_STORE+2);4356 4357 if ( SL_ISERROR(fd = sl_open_read(FIL__, __LINE__, db_file, SL_YESPRIV)))4358 {4359 fprintf(stderr, _("ERROR: can't open %s for read (errnum = %ld)\n"),4360 db_file, fd);4361 _exit(EXIT_FAILURE);4362 return -1;4363 }4364 4365 /* fast forward to start of data4366 */4367 sh_hash_setdataent(fd, line, MAX_PATH_STORE+1, db_file);4368 4369 while (1)4370 {4371 p = sh_hash_getdataent (fd, line, MAX_PATH_STORE+1);4372 if ((p != NULL) && (p->fullpath[0] == '/'))4373 {4374 if (!ListFile)4375 {4376 flag = 1;4377 if (ListFullDetail == S_FALSE)4378 sh_hash_list_db_entry (p);4379 else4380 sh_hash_list_db_entry_full_detail (p);4381 }4382 else4383 {4384 if (0 != sl_strcmp(ListFile, p->fullpath))4385 {4386 continue;4387 }4388 flag = 1;4389 if ('l' != p->theFile.c_mode[0])4390 {4391 if (sh_hash_printcontent(p->linkpath) < 0)4392 {4393 _exit(EXIT_FAILURE);4394 return -1;4395 }4396 }4397 else4398 {4399 fprintf(stderr, "%s",_("File is a link\n"));4400 _exit(EXIT_FAILURE);4401 return -1;4402 }4403 break;4404 }4405 }4406 else if (p == NULL)4407 {4408 break;4409 }4410 }4411 4412 if (line != NULL)4413 SH_FREE(line);4414 sl_close (fd);4415 4416 fflush(NULL);4417 4418 if (flag == 0)4419 {4420 fprintf(stderr, "%s",_("File not found\n"));4421 _exit(EXIT_FAILURE);4422 }4423 _exit(EXIT_SUCCESS);4424 return 0;4425 }4426 4427 3218 /* if defined(SH_WITH_CLIENT) || defined(SH_STANDALONE) */ 4428 3219 #endif -
trunk/src/sh_html.c
r473 r481 41 41 42 42 #include "samhain.h" 43 #include "sh_ forward.h"43 #include "sh_xfer.h" 44 44 #include "sh_error.h" 45 45 #include "sh_unix.h" … … 159 159 if (time_ptr != NULL) 160 160 strftime (ts1, 80, _("%d-%m-%Y %H:%M:%S"), time_ptr); 161 else 162 sl_strlcpy(ts1, _("01-01-1970 00:00:00"), sizeof(ts1)); 161 163 now = time(NULL); 162 164 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_LOCALTIME_R) … … 167 169 if (time_ptr != NULL) 168 170 strftime (ts2, 80, _("%d-%m-%Y %H:%M:%S"), time_ptr); 171 else 172 sl_strlcpy(ts2, _("01-01-1970 00:00:00"), sizeof(ts2)); 169 173 170 174 sl_snprintf(outline, 1023, … … 193 197 if (time_ptr != NULL) 194 198 strftime (ts1, 80, _("%d-%m-%Y %H:%M:%S"), time_ptr); 199 else 200 sl_strlcpy(ts1, _("01-01-1970 00:00:00"), sizeof(ts1)); 195 201 sl_snprintf(outline, 1023, 196 202 _("<p>Last connection at %s</p>"), … … 416 422 int status; 417 423 int clt_status; 418 int i, n;424 unsigned int i, n; 419 425 420 426 SL_ENTER(_("sh_html_print_one")); -
trunk/src/sh_ignore.c
r438 r481 73 73 SL_ENTER(_("sh_ignore_add")); 74 74 75 if ( (addpath == NULL) || (sl_ok_adds(2, strlen(addpath)) == S L_FALSE) )75 if ( (addpath == NULL) || (sl_ok_adds(2, strlen(addpath)) == S_FALSE) ) 76 76 { 77 77 SL_RETURN(list, _("sh_ignore_add")); -
trunk/src/sh_inotify.c
r474 r481 135 135 int class; 136 136 int rdepth; 137 unsigned long check_ mask;137 unsigned long check_flags; 138 138 char * file; 139 139 } sh_watch; … … 236 236 int ifd = sh_inotify_getfd(); 237 237 238 len = sl_read_timeout_fd (ifd, buffer, count, timeout, S L_FALSE);238 len = sl_read_timeout_fd (ifd, buffer, count, timeout, S_FALSE); 239 239 240 240 return len; … … 364 364 365 365 char * sh_inotify_pop_dormant(sh_watches * watches, 366 int * class, unsigned long * check_ mask,366 int * class, unsigned long * check_flags, 367 367 int * type, int * rdepth) 368 368 { … … 384 384 *type = this->watch->type; 385 385 *rdepth = this->watch->rdepth; 386 *check_ mask = this->watch->check_mask;386 *check_flags = this->watch->check_flags; 387 387 popret = sh_util_strdup_track(this->watch->file, __FILE__, __LINE__); 388 388 … … 424 424 static zAVLKey sh_inotify_getkey(void const *item) 425 425 { 426 return (&(( sh_watch *)item)->watch);426 return (&((const sh_watch *)item)->watch); 427 427 } 428 428 … … 490 490 int sh_inotify_add_watch_later(const char * filename, sh_watches * watches, 491 491 int * errnum, 492 int class, unsigned long check_ mask, int type,492 int class, unsigned long check_flags, int type, 493 493 int rdepth) 494 494 { … … 500 500 item->type = (short) type; 501 501 item->rdepth = (short) rdepth; 502 item->check_ mask = check_mask;502 item->check_flags = check_flags; 503 503 504 504 sh_inotify_add_dormant(watches, item); … … 548 548 549 549 extern void sh_fInotify_report_add(char * path, 550 int class, unsigned long check_ mask);550 int class, unsigned long check_flags); 551 551 552 552 sh_dummy_litem = (void*) &litem; … … 575 575 SH_MUTEX_UNLOCK(mutex_watches); 576 576 577 sh_fInotify_report_add(litem->file, litem->class, litem->check_ mask);577 sh_fInotify_report_add(litem->file, litem->class, litem->check_flags); 578 578 579 579 litem = sh_inotify_list_del_cur(&listcursor, save); … … 592 592 */ 593 593 int sh_inotify_add_watch(char * filename, sh_watches * watches, int * errnum, 594 int class, unsigned long check_ mask, int type, int rdepth)594 int class, unsigned long check_flags, int type, int rdepth) 595 595 { 596 596 volatile int retval = 0; … … 637 637 item->type = type; 638 638 item->rdepth = rdepth; 639 item->check_ mask = check_mask;639 item->check_flags = check_flags; 640 640 641 641 if (NULL == watches->list_of_watches) … … 692 692 693 693 char * sh_inotify_search_item(sh_watches * watches, int watch, 694 int * class, unsigned long * check_ mask,694 int * class, unsigned long * check_flags, 695 695 int * type, int * rdepth) 696 696 { … … 709 709 { 710 710 *class = item->class; 711 *check_ mask = item->check_mask;711 *check_flags = item->check_flags; 712 712 *type = item->type; 713 713 *rdepth = item->rdepth; … … 882 882 883 883 int sh_inotify_add_watch(char * filename, sh_watches * watches, int * errnum, 884 int class, unsigned long check_ mask, int type, int rdepth)884 int class, unsigned long check_flags, int type, int rdepth) 885 885 { 886 886 (void) filename; 887 887 (void) watches; 888 888 (void) class; 889 (void) check_ mask;889 (void) check_flags; 890 890 (void) type; 891 891 (void) rdepth; … … 898 898 int sh_inotify_add_watch_later(const char * filename, sh_watches * watches, 899 899 int * errnum, 900 int class, unsigned long check_ mask, int type, int rdepth)900 int class, unsigned long check_flags, int type, int rdepth) 901 901 { 902 902 (void) filename; 903 903 (void) watches; 904 904 (void) class; 905 (void) check_ mask;905 (void) check_flags; 906 906 (void) type; 907 907 (void) rdepth; … … 927 927 int type; 928 928 int rdepth; 929 unsigned long check_ mask;929 unsigned long check_flags; 930 930 int nrun = 0; 931 931 … … 1022 1022 CuAssertIntEquals(tc, count, 5); 1023 1023 1024 p = sh_inotify_pop_dormant(&twatch, &class, &check_ mask, &type, &rdepth);1024 p = sh_inotify_pop_dormant(&twatch, &class, &check_flags, &type, &rdepth); 1025 1025 CuAssertStrEquals(tc, p, "a5"); 1026 1026 1027 p = sh_inotify_pop_dormant(&twatch, &class, &check_ mask, &type, &rdepth);1027 p = sh_inotify_pop_dormant(&twatch, &class, &check_flags, &type, &rdepth); 1028 1028 CuAssertStrEquals(tc, p, "a3"); 1029 1029 CuAssertIntEquals(tc, class, 3); 1030 1030 1031 p = sh_inotify_pop_dormant(&twatch, &class, &check_ mask, &type, &rdepth);1031 p = sh_inotify_pop_dormant(&twatch, &class, &check_flags, &type, &rdepth); 1032 1032 CuAssertTrue(tc, NULL == p); 1033 1033 CuAssertTrue(tc, NULL == twatch.dormant_watches); -
trunk/src/sh_ipvx.c
r449 r481 165 165 name, name_size, NULL, 0, NI_NUMERICHOST); 166 166 167 168 /* fprintf(stderr, "FIXME: Error %s (%d), name %s (%d)\n",169 gai_strerror(ret), ret, name, name_size); */170 171 167 if (ret != 0 && name_size > 0) 172 168 { … … 343 339 } 344 340 345 static void * sh_dummy_out;341 void * sh_dummy_341_out; 346 342 347 343 char * sh_ipvx_canonical(const char * hostname, char * numeric, size_t nlen) … … 361 357 numeric[0] = '\0'; 362 358 363 sh_dummy_ out = (void *) &out;359 sh_dummy_341_out = (void *) &out; 364 360 365 361 if (sh_ipvx_is_numeric(hostname)) … … 426 422 numeric[0] = '\0'; 427 423 428 sh_dummy_ out = (void *) &out;424 sh_dummy_341_out = (void *) &out; 429 425 430 426 if (sh_ipvx_is_numeric(hostname)) -
trunk/src/sh_log_check.c
r425 r481 143 143 size_t plen = strlen(entry->d_name) + 1; 144 144 145 if (S L_TRUE == sl_ok_adds(plen, dlen))145 if (S_TRUE == sl_ok_adds(plen, dlen)) 146 146 { 147 147 plen += dlen; … … 180 180 plen = strlen(dir); 181 181 182 if (S L_TRUE == sl_ok_adds(plen, 130))182 if (S_TRUE == sl_ok_adds(plen, 130)) 183 183 { 184 184 plen += 130; /* 64 + 64 + 2 */ … … 500 500 * by longjmp' warning. And no, 'volatile' proved insufficient. 501 501 */ 502 static void * sh_dummy_thisfile = NULL;502 void * sh_dummy_502_thisfile = NULL; 503 503 504 504 void sh_check_watches() … … 512 512 * Avoids the 'clobbered by longjmp' warning. 513 513 */ 514 sh_dummy_ thisfile = (void*) &thisfile;514 sh_dummy_502_thisfile = (void*) &thisfile; 515 515 516 516 while (thisfile) -
trunk/src/sh_log_correlate.c
r358 r481 105 105 int sh_keep_comp(const void * a, const void * b) 106 106 { 107 return ( (int)((( struct sh_keep *)a)->last) -108 (int)((( struct sh_keep *)b)->last) );107 return ( (int)(((const struct sh_keep *)a)->last) - 108 (int)(((const struct sh_keep *)b)->last) ); 109 109 } 110 110 -
trunk/src/sh_log_evalrule.c
r383 r481 470 470 } 471 471 472 st atic struct sh_qeval ** dummy_queue;473 static char ** dummy_dstr;472 struct sh_qeval ** sh_dummy_472_queue; 473 char ** sh_dummy_473_dstr; 474 474 475 475 int sh_eval_radd (const char * str) … … 477 477 struct sh_geval * nr; 478 478 struct sh_geval * tmp; 479 struct sh_qeval * queue = NULL;479 struct sh_qeval * queue; 480 480 pcre * rule; 481 481 pcre_extra * rule_extra; … … 506 506 splits = split_array(new, &nfields, ':', lengths); 507 507 508 dummy_queue = &queue; 509 dummy_dstr = &dstr; 508 sh_dummy_472_queue = &queue; 509 sh_dummy_473_dstr = &dstr; 510 511 queue = NULL; 510 512 511 513 if (nfields < 2 || nfields > 3) … … 593 595 pcre_fullinfo(rule, rule_extra, PCRE_INFO_CAPTURECOUNT, &captures); 594 596 595 if (flag_err_debug == S L_TRUE)597 if (flag_err_debug == S_TRUE) 596 598 { 597 599 char * emsg = SH_ALLOC(SH_ERRBUF_SIZE); … … 654 656 if (group_open) 655 657 { 656 if (flag_err_debug == S L_TRUE)658 if (flag_err_debug == S_TRUE) 657 659 { 658 660 char * emsg = SH_ALLOC(SH_ERRBUF_SIZE); … … 826 828 * filled in 827 829 */ 828 st atic struct sh_geval ** dummy1;830 struct sh_geval ** sh_dummy_828_rule; 829 831 830 832 static struct sh_geval * test_rule (struct sh_geval * rule, sh_string *msg, time_t tstamp) … … 834 836 volatile time_t timestamp = tstamp; 835 837 836 dummy1= &rule;838 sh_dummy_828_rule = &rule; 837 839 838 840 if (!rule) … … 844 846 do { 845 847 846 if (flag_err_debug == S L_TRUE)848 if (flag_err_debug == S_TRUE) 847 849 { 848 850 char * emsg = SH_ALLOC(SH_ERRBUF_SIZE); … … 864 866 rule->ovecnum = res; 865 867 866 if (flag_err_debug == S L_TRUE)868 if (flag_err_debug == S_TRUE) 867 869 { 868 870 char * emsg = SH_ALLOC(SH_ERRBUF_SIZE); … … 900 902 } 901 903 902 if (flag_err_debug == S L_TRUE)904 if (flag_err_debug == S_TRUE) 903 905 { 904 906 char * emsg = SH_ALLOC(SH_ERRBUF_SIZE); … … 919 921 DEBUG("debug: no match found\n"); 920 922 /* If there was no match, this is NULL */ 921 dummy1= NULL;923 sh_dummy_828_rule = NULL; 922 924 return rule; 923 925 } … … 926 928 * against msg 927 929 */ 928 st atic struct sh_geval ** dummy2;929 st atic struct sh_geval ** dummy3;930 struct sh_geval ** sh_dummy_928_result; 931 struct sh_geval ** sh_dummy_929_group; 930 932 931 933 static struct sh_geval * test_grules (struct sh_heval * host, … … 936 938 struct sh_geval * group = host->rulegroups; 937 939 938 dummy2= &result;939 dummy3= &group;940 sh_dummy_928_result = &result; 941 sh_dummy_929_group = &group; 940 942 941 943 if (group && sh_string_len(msg) < (size_t)INT_MAX) … … 947 949 /* this is a rule group */ 948 950 949 if (flag_err_debug == S L_TRUE)951 if (flag_err_debug == S_TRUE) 950 952 { 951 953 char * emsg = SH_ALLOC(SH_ERRBUF_SIZE); … … 975 977 */ 976 978 977 if (flag_err_debug == S L_TRUE)979 if (flag_err_debug == S_TRUE) 978 980 { 979 981 char * emsg = SH_ALLOC(SH_ERRBUF_SIZE); … … 995 997 } 996 998 997 dummy2= NULL;998 dummy3= NULL;999 sh_dummy_928_result = NULL; 1000 sh_dummy_929_group = NULL; 999 1001 return result; 1000 1002 } … … 1113 1115 static zAVLKey sh_eval_getkey(void const *item) 1114 1116 { 1115 return (( struct sh_ceval *)item)->hostname->str;1117 return ((const struct sh_ceval *)item)->hostname->str; 1116 1118 } 1117 1119 -
trunk/src/sh_log_mark.c
r363 r481 68 68 static zAVLKey sh_log_mark_getkey(void const *item) 69 69 { 70 return (( struct sh_mark_event *)item)->label->str;70 return ((const struct sh_mark_event *)item)->label->str; 71 71 } 72 72 -
trunk/src/sh_log_parse_apache.c
r362 r481 63 63 * by longjmp' warning. And no, 'volatile' proved insufficient. 64 64 */ 65 static void * sh_dummy_new = NULL;66 static void * sh_dummy_fti = NULL;67 static void * sh_dummy_ftr = NULL;65 void * sh_dummy_65_new = NULL; 66 void * sh_dummy_66_fti = NULL; 67 void * sh_dummy_67_ftr = NULL; 68 68 69 69 void * sh_eval_fileinfo_apache(char * str) … … 88 88 * Avoids the 'clobbered by longjmp' warning. 89 89 */ 90 sh_dummy_ new = (void*) &new;91 sh_dummy_ fti = (void*) &f_time;92 sh_dummy_ ftr = (void*) &result;90 sh_dummy_65_new = (void*) &new; 91 sh_dummy_66_fti = (void*) &f_time; 92 sh_dummy_67_ftr = (void*) &result; 93 93 94 94 if (0 == strncmp("common", str, 6)) … … 109 109 } 110 110 111 if (flag_err_debug == S L_TRUE)111 if (flag_err_debug == S_TRUE) 112 112 { 113 113 SH_MUTEX_LOCK(mutex_thread_nolog); … … 251 251 sh_string_add_from_char(re_string, "$"); 252 252 253 if (flag_err_debug == S L_TRUE)253 if (flag_err_debug == S_TRUE) 254 254 { 255 255 SH_MUTEX_LOCK(mutex_thread_nolog); … … 304 304 char tstr[128]; 305 305 char sstr[128]; 306 c har* hstr;306 const char * hstr; 307 307 int res; 308 308 const char **hstr_addr = (const char **) &hstr; … … 310 310 struct sh_fileinfo_apache * info = (struct sh_fileinfo_apache *) fileinfo; 311 311 312 if (sh_string_len(logline) > 0 && flag_err_debug == S L_TRUE)312 if (sh_string_len(logline) > 0 && flag_err_debug == S_TRUE) 313 313 { 314 314 SH_MUTEX_LOCK(mutex_thread_nolog); … … 409 409 record->pid = PID_INVALID; 410 410 411 pcre_free (hstr);411 pcre_free_substring(hstr); 412 412 return record; 413 413 } -
trunk/src/sh_log_parse_generic.c
r362 r481 46 46 static void default_time (struct sh_logrecord * record) 47 47 { 48 struct tm ts; 48 struct tm ts; 49 struct tm * ts_ptr; 49 50 char tmp[80]; 50 51 size_t len; … … 53 54 54 55 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_LOCALTIME_R) 55 localtime_r (&(record->timestamp), &ts);56 ts_ptr = localtime_r (&(record->timestamp), &ts); 56 57 #else 57 memcpy(&ts, localtime(&(record->timestamp)), sizeof(struct tm)); 58 ts_ptr = localtime(&(record->timestamp)); 59 if (ts_ptr) 60 memcpy(&ts, ts_ptr, sizeof(struct tm)); 58 61 #endif 59 len = strftime(tmp, sizeof(tmp), _("%Y-%m-%dT%H:%M:%S"), &ts); 60 62 if (ts_ptr) 63 len = strftime(tmp, sizeof(tmp), _("%Y-%m-%dT%H:%M:%S"), &ts); 64 else 65 { 66 sl_strlcpy(tmp, _("1970-01-01T00:00:00"), sizeof(tmp)); 67 len = strlen(tmp); 68 } 61 69 record->timestr = sh_string_new_from_lchar(tmp, len); 62 70 -
trunk/src/sh_log_parse_pacct.c
r384 r481 292 292 } 293 293 294 static void * sh_dummy_record = NULL;294 void * sh_dummy_294_record = NULL; 295 295 296 296 struct sh_logrecord * sh_parse_pacct (sh_string * logline, void * fileinfo) … … 303 303 (void) fileinfo; 304 304 305 sh_dummy_ record = (void *) &record;306 307 if (sh_string_len(logline) > 0 && flag_err_debug == S L_TRUE)305 sh_dummy_294_record = (void *) &record; 306 307 if (sh_string_len(logline) > 0 && flag_err_debug == S_TRUE) 308 308 { 309 309 SH_MUTEX_LOCK(mutex_thread_nolog); -
trunk/src/sh_log_parse_syslog.c
r357 r481 78 78 79 79 80 if (flag_err_debug == S L_TRUE && sh_string_len(logline) > 0)80 if (flag_err_debug == S_TRUE && sh_string_len(logline) > 0) 81 81 { 82 82 SH_MUTEX_LOCK(mutex_thread_nolog); -
trunk/src/sh_mail.c
r383 r481 69 69 #undef BAD 70 70 71 static int failedMail = S L_FALSE;71 static int failedMail = S_FALSE; 72 72 73 73 static dnsrep * return_mx (char *domain); … … 337 337 SL_ENTER(_("sh_mail_pushstack")); 338 338 339 if (msg == NULL || failedMail == S L_TRUE /* || sh.srvmail.name[0] == '\0' */)339 if (msg == NULL || failedMail == S_TRUE /* || sh.srvmail.name[0] == '\0' */) 340 340 SL_RETURN((0), (_("sh_mail_pushstack"))); 341 341 … … 550 550 * Return if we cannot mail. 551 551 */ 552 if (failedMail == S L_TRUE)552 if (failedMail == S_TRUE) 553 553 SL_RETURN((-1), _("sh_mail_msg")); 554 554 … … 564 564 sh_mail_emptystack(); 565 565 sh.mailNum.alarm_last = 0; 566 failedMail = S L_TRUE;566 failedMail = S_TRUE; 567 567 SL_RETURN((-1), _("sh_mail_msg")); 568 568 } … … 1259 1259 my_time = time(NULL); 1260 1260 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_LOCALTIME_R) 1261 my_tm 1261 my_tm = localtime_r(&my_time, &time_tm); 1262 1262 #else 1263 my_tm = localtime(&my_time); 1264 #endif 1265 1263 my_tm = localtime(&my_time); 1264 #endif 1265 1266 if (!my_tm) 1267 { 1268 sl_strlcpy(my_tbuf, _("Thu, 01 Jan 1970 00:00:00 +00:00"), sizeof(my_tbuf)); 1269 } 1270 else 1271 { 1266 1272 #if defined(HAVE_STRFTIME_Z) 1267 (void)strftime(my_tbuf, 127, _("%a, %d %b %Y %H:%M:%S %z"), my_tm);1273 (void) strftime(my_tbuf, 127, _("%a, %d %b %Y %H:%M:%S %z"), my_tm); 1268 1274 #else 1269 (void) strftime(my_tbuf, 127, _("%a, %d %b %Y %H:%M:%S %Z"), my_tm); 1270 #endif 1275 (void) strftime(my_tbuf, 127, _("%a, %d %b %Y %H:%M:%S %Z"), my_tm); 1276 #endif 1277 } 1271 1278 1272 1279 TPT(( 0, FIL__, __LINE__, _("msg=<From: <%s>%c%cTo: <%s>%c%cDate: %s>%c%c"), … … 1339 1346 char * tmp; 1340 1347 1341 if (flag_err_debug == S L_TRUE)1348 if (flag_err_debug == S_TRUE) 1342 1349 { 1343 1350 tmp = sh_util_safe_name_keepspace(reply); … … 1382 1389 reply[0] = '\0'; 1383 1390 1384 while (sl_read_timeout_fd (ma_socket, &c, 1, time_wait, S L_FALSE) > 0) {1391 while (sl_read_timeout_fd (ma_socket, &c, 1, time_wait, S_FALSE) > 0) { 1385 1392 1386 1393 if (ireply < (sizeof(reply) - 1)) -
trunk/src/sh_mem.c
r459 r481 112 112 #endif 113 113 114 static memlist_t ** sh_mem_merr_1;114 memlist_t ** sh_dummy_114_merrlist; 115 115 116 116 void sh_mem_stat () … … 121 121 SL_ENTER(_("sh_mem_stat")); 122 122 123 sh_ mem_merr_1= (memlist_t **) &merrlist;123 sh_dummy_114_merrlist = (memlist_t **) &merrlist; 124 124 125 125 if (Alloc_Count == Free_Count) … … 166 166 } 167 167 168 static memlist_t ** sh_mem_merr_2;168 memlist_t ** sh_dummy_168_merrlist; 169 169 170 170 void sh_mem_check () … … 177 177 SL_ENTER(_("sh_mem_check")); 178 178 179 sh_ mem_merr_2= (memlist_t **) &merrlist;179 sh_dummy_168_merrlist = (memlist_t **) &merrlist; 180 180 181 181 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_MSTAMP, -
trunk/src/sh_modules.c
r372 r481 12 12 #include "sh_mounts.h" 13 13 #include "sh_userfiles.h" 14 #include "sh_kern.h"15 14 #include "sh_suidchk.h" 16 15 #include "sh_processcheck.h" … … 68 67 N_("[UserFiles]"), 69 68 sh_userfiles_table, 70 PTHREAD_MUTEX_INITIALIZER,71 },72 #endif73 74 #ifdef SH_USE_KERN75 {76 N_("KERNEL"),77 -1,78 0,79 sh_kern_init,80 sh_kern_timer,81 sh_kern_check,82 sh_kern_end,83 sh_kern_null,84 85 N_("[Kernel]"),86 sh_kern_table,87 69 PTHREAD_MUTEX_INITIALIZER, 88 70 }, -
trunk/src/sh_nmail.c
r474 r481 329 329 const void * rcv_info) 330 330 { 331 struct alias * rcv = (struct alias *) rcv_info;331 const struct alias * rcv = (const struct alias *) rcv_info; 332 332 333 333 if (!alias || 0 == strcmp(alias, sh_string_str(rcv->recipient))) -
trunk/src/sh_port2proc.c
r384 r481 945 945 continue; 946 946 947 /* fprintf(stderr, "FIXME: %d %d, %d %d, %d %d, %d, %d\n", s->proto, proto,948 s->family, AF_INET,949 sport, ntohs(((struct sockaddr_in *)(&s->laddr))->sin_port),950 (int) xf->xf_uid, (int)xf->xf_pid);951 */952 953 947 if (s->proto != proto) 954 948 continue; … … 970 964 haddr6 = &((struct sockaddr_in6 *)(&s->laddr))->sin6_addr; 971 965 972 973 /* fprintf(stderr, "FIXME: %s\n", inet_ntoa(*haddr)); */974 /* fprintf(stderr, "FIXME: %s\n", inet_ntoa(*saddr)); */975 966 976 967 if ( (s->family == AF_INET && -
trunk/src/sh_portcheck.c
r473 r481 529 529 * by longjmp' warning. And no, 'volatile' proved insufficient. 530 530 */ 531 static void * sh_dummy_pre = NULL;532 static void * sh_dummy_ptr = NULL;531 void * sh_dummy_531_pre = NULL; 532 void * sh_dummy_532_ptr = NULL; 533 533 534 534 /* check the list of open ports for any that are marked as UNKN 535 535 */ 536 static void sh_portchk_check_list (struct sh_portentry ** head, int proto, int report) 536 static void sh_portchk_check_list (struct sh_portentry ** head, 537 int proto, int report) 537 538 { 538 539 struct sh_portentry * ptr = *head; … … 543 544 * Avoids the 'clobbered by longjmp' warning. 544 545 */ 545 sh_dummy_ pre = (void*) ⪯546 sh_dummy_ ptr = (void*) &ptr;546 sh_dummy_531_pre = (void*) ⪯ 547 sh_dummy_532_ptr = (void*) &ptr; 547 548 548 549 while (ptr) … … 616 617 } 617 618 618 sh_dummy_ ptr = NULL;619 sh_dummy_ pre = NULL;619 sh_dummy_532_ptr = NULL; 620 sh_dummy_531_pre = NULL; 620 621 621 622 return; … … 1561 1562 /* Subroutine to add an interface 1562 1563 */ 1563 static void * sh_dummy_str = NULL; /* fix clobbered by.. warning */1564 void * sh_dummy_1564_str = NULL; /* fix clobbered by.. warning */ 1564 1565 1565 1566 static int sh_portchk_add_interface (const char * str) … … 1569 1570 char buf[64]; 1570 1571 1571 sh_dummy_ str = (void*) &str;1572 sh_dummy_1564_str = (void*) &str; 1572 1573 1573 1574 if (iface_initialized == 0) … … 1610 1611 } while (*str); 1611 1612 1612 sh_dummy_ str = NULL;1613 sh_dummy_1564_str = NULL; 1613 1614 return 0; 1614 1615 } -
trunk/src/sh_prelink.c
r379 r481 87 87 return S_FALSE; 88 88 89 status = sl_read_timeout (fd, magic, 4, alert_timeout, S L_FALSE);89 status = sl_read_timeout (fd, magic, 4, alert_timeout, S_FALSE); 90 90 (void) sl_rewind(fd); 91 91 if (status == 4) … … 156 156 /* returns static storage 157 157 */ 158 int sh_prelink_run (char * path, char * file_hash, int alert_timeout )158 int sh_prelink_run (char * path, char * file_hash, int alert_timeout, unsigned long mask) 159 159 { 160 160 static int init = S_FALSE; … … 262 262 char hashbuf[KEYBUF_SIZE]; 263 263 UINT64 length_nolim = TIGER_NOLIM; 264 if (sh.flag.opts == S_TRUE) sh_tiger_set_hashtype_mask(mask); 264 265 sl_strlcpy(file_hash, 265 266 sh_tiger_generic_hash (path, task.pipeTI, &length_nolim, alert_timeout, -
trunk/src/sh_processcheck.c
r399 r481 411 411 * by longjmp' warning. And no, 'volatile' proved insufficient. 412 412 */ 413 static void * sh_dummy_watchlist = NULL;413 void * sh_dummy_413_watchlist = NULL; 414 414 415 415 static void check_watchlist (short * res) … … 422 422 * Avoids the 'clobbered by longjmp' warning. 423 423 */ 424 sh_dummy_ watchlist = (void*) &list;424 sh_dummy_413_watchlist = (void*) &list; 425 425 426 426 while (list) … … 468 468 } 469 469 470 sh_dummy_ watchlist = NULL;470 sh_dummy_413_watchlist = NULL; 471 471 return; 472 472 } … … 625 625 value = (size_t) strtoul(str, &foo, 0); 626 626 627 if (*foo == '\0' && S L_TRUE == sl_ok_adds(value, 1)) {627 if (*foo == '\0' && S_TRUE == sl_ok_adds(value, 1)) { 628 628 sh_prochk_maxpid = value + 1; 629 629 userdef_maxpid = 1; … … 934 934 { 935 935 tstr[pos-1] = '\0'; 936 if (flag_err_debug == S L_TRUE)936 if (flag_err_debug == S_TRUE) 937 937 { 938 938 SH_MUTEX_LOCK(mutex_thread_nolog); -
trunk/src/sh_readconf.c
r432 r481 33 33 #include "sh_unix.h" 34 34 #include "sh_files.h" 35 #include "sh_ forward.h"35 #include "sh_xfer.h" 36 36 #include "sh_gpg.h" 37 37 #include "sh_hash.h" 38 #include "sh_dbIO.h" 38 39 #include "sh_ignore.h" 39 40 #include "sh_database.h" … … 49 50 #include "sh_utils.h" 50 51 #include "sh_restrict.h" 51 52 #include "sh_socket.h" 52 53 53 54 extern int set_reverse_lookup (const char * c); … … 137 138 { 138 139 #ifdef SH_EVAL_SHELL 139 char * tmp = (char*)str;140 char * tmp = sh_util_strdup(str); 140 141 char * out; 142 char * tmp_orig = tmp; 141 143 142 144 while (tmp && isspace((int)*tmp)) ++tmp; … … 150 152 tmp[len-1] = '\0'; 151 153 out = sh_ext_popen_str(&tmp[2]); 154 SH_FREE(tmp_orig); 152 155 return out; 153 156 } 154 157 } 158 SH_FREE(tmp_orig); 155 159 #endif 156 160 return sh_util_strdup(str); … … 384 388 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_D_START); 385 389 386 fd = sh_ forward_req_file(_("CONF"));390 fd = sh_xfer_request_file(_("CONF")); 387 391 388 392 if (!SL_ISERROR(fd)) … … 392 396 else if (sh.flag.checkSum != SH_CHECK_INIT) 393 397 { 398 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_TCP_FBAD); 394 399 aud_exit (FIL__, __LINE__, EXIT_FAILURE); 395 400 } 396 401 else 397 402 { 403 sh_error_handle(SH_ERR_WARN, FIL__, __LINE__, 0, MSG_TCP_FBAD); 398 404 sh_error_handle ((-1), FIL__, __LINE__, fd, MSG_D_FAIL); 399 405 local_file = 1; … … 490 496 /* Validate signature of open file. 491 497 */ 492 if (0 != sh_gpg_check_sign (fd, 0, 1))498 if (0 != sh_gpg_check_sign (fd, SIG_CONF)) 493 499 { 494 500 SH_FREE(line_in); 501 sh_error_handle ((-1), FIL__, __LINE__, 0, MSG_EXIT_ABORT1, sh.prg_name); 495 502 aud_exit (FIL__, __LINE__, EXIT_FAILURE); 496 503 } … … 830 837 } 831 838 839 840 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) 841 static int sh_readconf_set_delay (const char * c) 842 { 843 unsigned long i = atol (c); 844 845 if (i > INT_MAX) 846 return -i; 847 sh.delayload = (int) i; 848 return 0; 849 } 850 #endif 851 832 852 #ifdef FANCY_LIBCAP 833 853 int sh_readconf_setCaps(const char * c) … … 965 985 sh_files_pushfile_prelink }, 966 986 967 { N_("ignoreadded"), SH_SECTION_MISC, SH_SECTION_NONE,987 { N_("ignoreadded"), SH_SECTION_MISC, SH_SECTION_NONE, 968 988 sh_ignore_add_new }, 969 { N_("ignoremissing"), SH_SECTION_MISC, SH_SECTION_NONE,989 { N_("ignoremissing"), SH_SECTION_MISC, SH_SECTION_NONE, 970 990 sh_ignore_add_del }, 971 { N_("ignoremodified"), SH_SECTION_MISC, SH_SECTION_NONE,991 { N_("ignoremodified"), SH_SECTION_MISC, SH_SECTION_NONE, 972 992 sh_ignore_add_mod }, 973 993 974 { N_("skipchecksum"), SH_SECTION_MISC, SH_SECTION_NONE,994 { N_("skipchecksum"), SH_SECTION_MISC, SH_SECTION_NONE, 975 995 sh_restrict_define }, 976 { N_("filetype"), SH_SECTION_MISC, SH_SECTION_NONE,996 { N_("filetype"), SH_SECTION_MISC, SH_SECTION_NONE, 977 997 sh_restrict_add_ftype }, 978 998 … … 983 1003 sh_set_schedule_two }, 984 1004 985 { N_("usehardlinkcheck"), SH_SECTION_MISC, SH_SECTION_NONE,1005 { N_("usehardlinkcheck"), SH_SECTION_MISC, SH_SECTION_NONE, 986 1006 sh_files_check_hardlinks }, 987 { N_("usersrccheck"), SH_SECTION_MISC, SH_SECTION_NONE,1007 { N_("usersrccheck"), SH_SECTION_MISC, SH_SECTION_NONE, 988 1008 sh_files_use_rsrc }, 989 { N_("hardlinkoffset"), SH_SECTION_MISC, SH_SECTION_NONE,1009 { N_("hardlinkoffset"), SH_SECTION_MISC, SH_SECTION_NONE, 990 1010 sh_files_hle_reg }, 991 1011 #if defined(USE_XATTR) 992 { N_("useselinuxcheck"), SH_SECTION_MISC, SH_SECTION_NONE,1012 { N_("useselinuxcheck"), SH_SECTION_MISC, SH_SECTION_NONE, 993 1013 sh_unix_setcheckselinux }, 994 1014 #endif 995 1015 #if defined(USE_ACL) 996 { N_("useaclcheck"), SH_SECTION_MISC, SH_SECTION_NONE,1016 { N_("useaclcheck"), SH_SECTION_MISC, SH_SECTION_NONE, 997 1017 sh_unix_setcheckacl }, 998 1018 #endif 999 { N_("loosedircheck"), SH_SECTION_MISC, SH_SECTION_NONE,1019 { N_("loosedircheck"), SH_SECTION_MISC, SH_SECTION_NONE, 1000 1020 sh_hash_loosedircheck }, 1001 { N_("addokchars"), SH_SECTION_MISC, SH_SECTION_NONE,1021 { N_("addokchars"), SH_SECTION_MISC, SH_SECTION_NONE, 1002 1022 sh_util_obscure_ok }, 1003 { N_("filenamesareutf8"), SH_SECTION_MISC, SH_SECTION_NONE,1023 { N_("filenamesareutf8"), SH_SECTION_MISC, SH_SECTION_NONE, 1004 1024 sh_util_obscure_utf8 }, 1005 { N_("setrecursionlevel"), SH_SECTION_MISC, SH_SECTION_NONE,1025 { N_("setrecursionlevel"), SH_SECTION_MISC, SH_SECTION_NONE, 1006 1026 sh_files_setrecursion }, 1007 { N_("checksumtest"), SH_SECTION_MISC, SH_SECTION_NONE,1027 { N_("checksumtest"), SH_SECTION_MISC, SH_SECTION_NONE, 1008 1028 sh_util_setchecksum }, 1009 { N_("reportonlyonce"), SH_SECTION_MISC, SH_SECTION_NONE,1029 { N_("reportonlyonce"), SH_SECTION_MISC, SH_SECTION_NONE, 1010 1030 sh_files_reportonce }, 1011 { N_("reportfulldetail"), SH_SECTION_MISC, SH_SECTION_NONE,1031 { N_("reportfulldetail"), SH_SECTION_MISC, SH_SECTION_NONE, 1012 1032 sh_files_fulldetail }, 1013 { N_("uselocaltime"), SH_SECTION_MISC, SH_SECTION_NONE,1033 { N_("uselocaltime"), SH_SECTION_MISC, SH_SECTION_NONE, 1014 1034 sh_unix_uselocaltime }, 1015 1035 1016 { N_("setnicelevel"), SH_SECTION_MISC, SH_SECTION_NONE,1036 { N_("setnicelevel"), SH_SECTION_MISC, SH_SECTION_NONE, 1017 1037 sh_readconf_set_nice }, 1018 1038 1039 { N_("startuploaddelay"), SH_SECTION_MISC, SH_SECTION_NONE, 1040 sh_readconf_set_delay }, 1041 1019 1042 #if defined(FANCY_LIBCAP) 1020 { N_("usecaps"), SH_SECTION_MISC, SH_SECTION_NONE,1043 { N_("usecaps"), SH_SECTION_MISC, SH_SECTION_NONE, 1021 1044 sh_readconf_setCaps }, 1022 1045 #endif 1023 1046 1024 { N_("setdropcache"), SH_SECTION_MISC, SH_SECTION_NONE, 1047 { N_("reportcheckflags"), SH_SECTION_MISC, SH_SECTION_NONE, 1048 set_report_checkflags }, 1049 1050 { N_("setdropcache"), SH_SECTION_MISC, SH_SECTION_NONE, 1025 1051 sl_set_drop_cache }, 1026 1052 1027 { N_("setiolimit"), SH_SECTION_MISC, SH_SECTION_NONE,1053 { N_("setiolimit"), SH_SECTION_MISC, SH_SECTION_NONE, 1028 1054 sh_unix_set_io_limit }, 1029 1055 1030 1056 { N_("versionstring"), SH_SECTION_MISC, SH_SECTION_NONE, 1031 sh_ hash_version_string },1057 sh_dbIO_version_string }, 1032 1058 1033 1059 { N_("digestalgo"), SH_SECTION_MISC, SH_SECTION_NONE, … … 1092 1118 sh_socket_password }, 1093 1119 { N_("setstripdomain"), SH_SECTION_SRV, SH_SECTION_MISC, 1094 sh_ forward_set_strip },1120 sh_xfer_set_strip }, 1095 1121 { N_("useseparatelogs"), SH_SECTION_SRV, SH_SECTION_MISC, 1096 1122 set_flag_sep_log }, … … 1098 1124 sh_unix_set_chroot }, 1099 1125 { N_("setclienttimelimit"), SH_SECTION_SRV, SH_SECTION_MISC, 1100 sh_ forward_set_time_limit },1126 sh_xfer_set_time_limit }, 1101 1127 { N_("setconnectiontimeout"),SH_SECTION_SRV, SH_SECTION_MISC, 1102 sh_ forward_set_timeout },1128 sh_xfer_set_timeout }, 1103 1129 { N_("useclientseverity"), SH_SECTION_SRV, SH_SECTION_MISC, 1104 sh_ forward_use_clt_sev },1130 sh_xfer_use_clt_sev }, 1105 1131 { N_("useclientclass"), SH_SECTION_SRV, SH_SECTION_MISC, 1106 sh_ forward_use_clt_class },1132 sh_xfer_use_clt_class }, 1107 1133 { N_("severitylookup"), SH_SECTION_SRV, SH_SECTION_MISC, 1108 sh_ forward_lookup_level },1134 sh_xfer_lookup_level }, 1109 1135 { N_("setclientfromaccept"), SH_SECTION_SRV, SH_SECTION_MISC, 1110 1136 set_socket_peer }, 1111 1137 { N_("setserverport"), SH_SECTION_SRV, SH_SECTION_MISC, 1112 sh_ forward_set_port },1138 sh_xfer_set_port }, 1113 1139 { N_("setserverinterface"), SH_SECTION_SRV, SH_SECTION_MISC, 1114 sh_ forward_set_interface },1140 sh_xfer_set_interface }, 1115 1141 { N_("client"), SH_SECTION_CLIENTS, SH_SECTION_NONE, 1116 sh_ forward_register_client },1142 sh_xfer_register_client }, 1117 1143 #endif 1118 1144 … … 1124 1150 #if defined(SH_WITH_SERVER) 1125 1151 { N_("setlogserver"), SH_SECTION_SRV, SH_SECTION_MISC, 1126 sh_ forward_setlogserver },1152 sh_xfer_set_logserver }, 1127 1153 #else 1128 1154 { N_("setlogserver"), SH_SECTION_CLT, SH_SECTION_MISC, 1129 sh_ forward_setlogserver },1155 sh_xfer_set_logserver }, 1130 1156 { N_("setthrottle"), SH_SECTION_CLT, SH_SECTION_MISC, 1131 sh_forward_set_throttle_delay}, 1157 sh_xfer_set_throttle_delay}, 1158 { N_("setdeltaretrycount"), SH_SECTION_CLT, SH_SECTION_MISC, 1159 set_delta_retry_count}, 1160 { N_("setdeltaretryinterval"),SH_SECTION_CLT, SH_SECTION_MISC, 1161 set_delta_retry_interval}, 1132 1162 #endif 1133 1163 #endif … … 1274 1304 char * key; 1275 1305 const char * value; 1306 char * value_dup; 1276 1307 char * tmp; 1277 1308 int i; … … 1394 1425 * If !defined(SH_EVAL_SHELL), this will reduce to a strdup. 1395 1426 */ 1396 value = sh_readconf_expand_value(value); 1397 1398 if (!value || (*value) == '\0') 1399 { 1400 TPT(( 0, FIL__, __LINE__, _("msg=<ConfigFile: empty after shell expansion: %s>\n"), 1427 value_dup = sh_readconf_expand_value(value); 1428 1429 if (!value_dup || (*value_dup) == '\0') 1430 { 1431 TPT(( 0, FIL__, __LINE__, 1432 _("msg=<ConfigFile: empty after shell expansion: %s>\n"), 1401 1433 line)); 1402 1434 SL_RETURN(good_opt, _("sh_readconf_line")); 1403 1435 } 1436 1437 value = value_dup; 1404 1438 1405 1439 #if defined (SH_WITH_CLIENT) || defined (SH_STANDALONE) … … 1467 1501 } 1468 1502 1469 SH_FREE( (char*)value);1503 SH_FREE(value_dup); 1470 1504 1471 1505 SL_RETURN(good_opt, _("sh_readconf_line")); 1472 1506 } 1473 1507 1474 1508 -
trunk/src/sh_registry.c
r422 r481 889 889 size_t tlen = sl_strlen(tmp); 890 890 891 if (S L_TRUE == sl_ok_adds(64, tlen))891 if (S_TRUE == sl_ok_adds(64, tlen)) 892 892 { 893 893 char * errbuf; … … 905 905 0, NULL ); 906 906 907 if (elen > 0 && S L_TRUE == sl_ok_adds(elen, tlen))907 if (elen > 0 && S_TRUE == sl_ok_adds(elen, tlen)) 908 908 { 909 909 tlen += elen; … … 978 978 size_t tlen = sl_strlen(tmp); 979 979 980 if (S L_TRUE == sl_ok_adds(64, tlen))980 if (S_TRUE == sl_ok_adds(64, tlen)) 981 981 { 982 982 char * errbuf = SH_ALLOC(64 + tlen); -
trunk/src/sh_schedule.c
r454 r481 55 55 #include "samhain.h" 56 56 #include "sh_mem.h" 57 #include "sh_error_min.h" 57 58 58 59 /* TESTONLY */ … … 143 144 tval = localtime(&now); 144 145 #endif 146 147 if (!tval) 148 { 149 sh_error_handle ((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 150 _("localime() failed"), _("test_sched_int") ); 151 return 0; 152 } 153 145 154 count = 0; 146 155 for (i = 0; i < 5; ++i) -
trunk/src/sh_socket.c
r421 r481 33 33 #include <string.h> 34 34 35 #if TIME_WITH_SYS_TIME 36 #include <sys/time.h> 37 #include <time.h> 38 #else 39 #if HAVE_SYS_TIME_H 40 #include <sys/time.h> 41 #else 42 #include <time.h> 43 #endif 44 #endif 45 35 46 #include "samhain.h" 36 47 #include "sh_socket.h" … … 38 49 #include "sh_unix.h" 39 50 #include "sh_calls.h" 51 #include "sh_guid.h" 52 #include "sh_fifo.h" 53 #include "sh_utils.h" 40 54 41 55 #undef FIL__ … … 46 60 #include <signal.h> 47 61 62 typedef struct delta_tofetch { 63 char uuid[SH_UUID_BUF]; 64 time_t last_time; 65 unsigned int count; 66 } SH_DELTA_DB; 67 68 static SH_DELTA_DB * parse_entry(SH_DELTA_DB * db, const char * str) 69 { 70 long last_time; 71 unsigned int count; 72 char buf[SH_UUID_BUF]; 73 int res = sscanf(str, _("%u:%ld:%36s"), &count, &last_time, buf); 74 if (res == 3) 75 { 76 db->count = count; 77 db->last_time = (time_t) last_time; 78 sl_strlcpy(db->uuid, buf, SH_UUID_BUF); 79 return db; 80 } 81 return NULL; 82 } 83 84 static char * unparse_entry(const SH_DELTA_DB * db, char * str, size_t len) 85 { 86 int nbytes = sl_snprintf(str, len, _("%u:%ld:%s"), 87 db->count, (long) db->last_time, db->uuid); 88 if (nbytes < 0 || nbytes >= (int) len) 89 return NULL; 90 return str; 91 } 92 93 static SH_FIFO xfifo = SH_FIFO_INITIALIZER; 94 95 int sh_socket_store_uuid(const char * cmd) 96 { 97 char * p = sh_util_strdup(cmd); 98 char * q = strchr(cmd, ':'); 99 char entry[SH_BUFSIZE]; 100 SH_DELTA_DB db; 101 102 if (!q) { SH_FREE(p); return -1; } 103 104 ++q; 105 106 if (0 != sh_uuid_check(q)) { SH_FREE(p); return -1; } 107 108 db.count = 0; 109 db.last_time = (time_t) 0; 110 sl_strlcpy(db.uuid, q, SH_UUID_BUF); 111 SH_FREE(p); 112 113 if (NULL != unparse_entry(&db, entry, sizeof(entry))) 114 { 115 sh_fifo_push(&xfifo, entry); 116 return 0; 117 } 118 return -1; 119 } 120 121 static unsigned int try_interval = 60; 122 static unsigned int try_max = 2; 123 124 int set_delta_retry_interval(const char * str) 125 { 126 long val = strtol (str, (char **)NULL, 10); 127 128 if (val < 0 || val > INT_MAX) 129 return -1; 130 try_interval = (unsigned int) val; 131 return 0; 132 } 133 int set_delta_retry_count(const char * str) 134 { 135 long val = strtol (str, (char **)NULL, 10); 136 137 if (val < 0 || val > INT_MAX) 138 return -1; 139 try_max = (unsigned int) val; 140 return 0; 141 } 142 143 char * sh_socket_get_uuid(int * errflag, unsigned int * count, time_t * last) 144 { 145 char * entry = sh_fifo_pop(&xfifo); 146 char * uuid = NULL; 147 148 if (entry) 149 { 150 SH_DELTA_DB db; 151 time_t now; 152 153 if (NULL == parse_entry(&db, entry)) 154 { 155 SH_FREE(entry); 156 sh_error_handle(SH_ERR_WARN, FIL__, __LINE__, 0, MSG_E_SUBGEN, 157 _("Bad entry in fifo"), 158 _("sh_socket_get_uuid")); 159 *errflag = -1; 160 return NULL; 161 } 162 163 now = time(NULL); 164 165 if ( (db.count > 0) && ((unsigned long)(now - db.last_time) < try_interval) ) 166 { 167 sh_fifo_push_tail(&xfifo, entry); 168 SH_FREE(entry); 169 *errflag = -1; 170 return NULL; 171 } 172 173 SH_FREE(entry); 174 uuid = sh_util_strdup(db.uuid); 175 *count = db.count; 176 *last = db.last_time; 177 } 178 179 *errflag = 0; 180 return uuid; 181 } 182 183 int sh_socket_return_uuid (const char * uuid, unsigned int count, time_t last) 184 { 185 (void) last; 186 187 if (count < try_max) 188 { 189 char entry[SH_BUFSIZE]; 190 SH_DELTA_DB db; 191 time_t now = time(NULL); 192 193 db.count = count + 1; 194 db.last_time = now; 195 sl_strlcpy(db.uuid, uuid, SH_UUID_BUF); 196 197 if (NULL != unparse_entry(&db, entry, sizeof(entry))) 198 return sh_fifo_push_tail(&xfifo, entry); /* >0 for success */ 199 } 200 return -1; 201 } 202 48 203 void sh_socket_server_cmd(const char * srvcmd) 49 204 { … … 54 209 SL_RET0(_("sh_socket_server_cmd")); 55 210 } 56 if ((srvcmd[0] == 'S') && (srvcmd[1] == 'T') && 57 (srvcmd[2] == 'O') && (srvcmd[3] == 'P'))211 212 if (0 == strncmp(srvcmd, _("STOP"), 4)) 58 213 { 59 214 TPT((0, FIL__, __LINE__, _("msg=<stop command from server>\n"))); … … 65 220 #endif 66 221 } 67 else if ((srvcmd[0] == 'R') && (srvcmd[1] == 'E') && 68 (srvcmd[2] == 'L') && (srvcmd[3] == 'O') && 69 (srvcmd[4] == 'A') && (srvcmd[5] == 'D')) 222 223 else if (0 == strncmp(srvcmd, _("RELOAD"), 6)) 70 224 { 71 225 TPT((0, FIL__, __LINE__, _("msg=<reload command from server>\n"))); … … 77 231 #endif 78 232 } 79 else if ((srvcmd[0] == 'S') && (srvcmd[1] == 'C') && 80 (srvcmd[2] == 'A') && (srvcmd[3] == 'N')) 233 234 else if (0 == strncmp(srvcmd, _("DELTA:"), 6)) 235 { 236 TPT((0, FIL__, __LINE__, _("msg=<delta load command from server>\n"))); 237 238 if (sh_socket_store_uuid(srvcmd) == 0) 239 { 240 ++sh_load_delta_flag; 241 ++sig_raised; 242 } 243 } 244 245 else if (0 == strncmp(srvcmd, _("SCAN"), 4)) 81 246 { 82 247 TPT((0, FIL__, __LINE__, _("msg=<scan command from server>\n"))); 83 if (sh.flag.isdaemon == ON)248 if (sh.flag.isdaemon == S_TRUE) 84 249 { 85 250 #ifdef SIGTTOU … … 96 261 } 97 262 } 263 264 /* Unknown command 265 */ 98 266 else 99 267 { 100 sh_error_handle(SH_ERR_ INFO, FIL__, __LINE__, 0, MSG_E_SUBGEN,268 sh_error_handle(SH_ERR_WARN, FIL__, __LINE__, 0, MSG_E_SUBGEN, 101 269 srvcmd, 102 270 _("sh_socket_server_cmd")); … … 104 272 SL_RET0(_("sh_socket_server_cmd")); 105 273 } 106 /* #if defined (SH_WITH_CLIENT) 107 */ 108 #endif 274 #endif /* #if defined (SH_WITH_CLIENT) */ 109 275 110 276 #if defined(SH_WITH_SERVER) … … 225 391 struct stat buf; 226 392 227 #ifdef SH_DEBUG_SOCKET228 fprintf(stderr, "PROBE\n");229 #endif230 231 393 for (item = (client_t *) zAVLFirst(&avlcursor, all_clients); item; 232 394 item = (client_t *) zAVLNext(&avlcursor)) 233 395 { 234 #ifdef SH_DEBUG_SOCKET235 fprintf(stderr, "%s %d\n", item->hostname, (int)item->status_now);236 #endif237 238 396 if (item->status_now != CLT_INACTIVE) 239 397 { … … 242 400 file = get_client_conf_file (item->hostname, &dummy); 243 401 244 #ifdef SH_DEBUG_SOCKET245 fprintf(stderr, "%s\n", file);246 #endif247 402 if (0 == stat (file, &buf)) 248 403 { … … 250 405 while (new) 251 406 { 252 #ifdef SH_DEBUG_SOCKET253 fprintf(stderr, "%s <> %s\n", new->clt, item->hostname);254 #endif255 407 if (0 == sl_strcmp(new->clt, item->hostname)) 256 408 { 257 409 flag = 1; /* Client is in list already */ 258 410 259 #ifdef SH_DEBUG_SOCKET260 fprintf(stderr, "%lu <> %lu\n",261 (unsigned long) buf.st_mtime,262 (unsigned long)new->cti);263 #endif264 411 if (buf.st_mtime > new->cti) 265 412 { … … 368 515 369 516 #define NEED_PASSWORD_AUTH 370 371 517 #endif 372 518 … … 540 686 SL_RETURN( (0), _("sh_socket_open_int")); 541 687 } 542 /* #if !defined(HAVE_CMSGCRED) || !defined(SO_PEERCRED) */ 543 /* #endif */ 544 545 /* 546 #if !defined(HAVE_GETPEEREID) && !defined(SO_PEERCRED) && !defined(HAVE_STRUCT_CMSGCRED) && !defined(HAVE_STRUCT_FCRED) && !(defined(HAVE_STRUCT_SOCKCRED) && defined(LOCAL_CREDS)) 547 static 548 int sh_socket_read (struct socket_cmd * srvcmd) 549 { 550 srvcmd->cmd[0] = '\0'; 551 srvcmd->clt[0] = '\0'; 552 return 0; 553 } 554 #else 555 */ 688 556 689 557 690 /* … … 582 715 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 583 716 */ 584 static 585 int sh_socket_read (struct socket_cmd * srvcmd) 586 { 587 struct socket_cmd * list_cmd; 588 char message[SH_MAXMSG]; 589 struct sockaddr_un name; 590 ACCEPT_TYPE_ARG3 size = sizeof(name); 591 717 718 static int receive_message(int talkfd, struct msghdr * msg, size_t message_size) 719 { 720 unsigned int retry = 0; 592 721 int nbytes; 593 int talkfd; 594 int retry = 0; 595 596 char * cmd = NULL; 597 char * clt = NULL; 598 599 int client_uid = -1; 722 char * message = msg->msg_iov->iov_base; 600 723 char errbuf[SH_ERRBUF_SIZE]; 601 724 602 603 struct msghdr msg;604 struct iovec iov;605 606 #if defined(NEED_PASSWORD_AUTH)607 char * eopw = NULL;608 char * goodpassword = NULL;609 #endif610 611 #if defined(HAVE_GETPEEREID)612 uid_t peer_uid;613 gid_t peer_gid;614 #elif defined(SO_PEERCRED)615 struct ucred cr;616 #ifdef HAVE_SOCKLEN_T617 socklen_t cl = sizeof(cr);618 #else619 int cl = sizeof(cr);620 #endif621 622 #elif defined(HAVE_STRUCT_CMSGCRED) || defined(HAVE_STRUCT_FCRED) || (defined(HAVE_STRUCT_SOCKCRED) && defined(LOCAL_CREDS))623 624 #ifdef HAVE_STRUCT_CMSGCRED625 typedef struct cmsgcred Cred;626 #define CRED_UID cmcred_uid627 628 #elif HAVE_STRUCT_FCRED629 typedef struct fcred Cred;630 #define CRED_UID fc_uid631 632 #elif HAVE_STRUCT_SOCKCRED633 typedef struct sockcred Cred;634 #define CRED_UID sc_uid635 636 #endif637 Cred *cred;638 639 /* Compute size without padding */640 char cmsgmem[ALIGN(sizeof(struct cmsghdr)) + ALIGN(sizeof(Cred))];641 /* for NetBSD */642 643 /* Point to start of first structure */644 struct cmsghdr *cmsg = (struct cmsghdr *) cmsgmem;645 #endif646 647 if (pf_unix_fd < 0)648 {649 return 0;650 }651 652 iov.iov_base = (char *) &message;653 iov.iov_len = sizeof(message);654 655 memset (&msg, 0, sizeof (msg));656 msg.msg_iov = &iov;657 msg.msg_iovlen = 1;658 659 #if !defined(SO_PEERCRED) && !defined(HAVE_GETPEEREID)660 #if defined(HAVE_STRUCT_CMSGCRED) || defined(HAVE_STRUCT_FCRED) || (defined(HAVE_STRUCT_SOCKCRED) && defined(LOCAL_CREDS))661 msg.msg_control = (char *) cmsg;662 msg.msg_controllen = sizeof (cmsgmem);663 memset (cmsg, 0, sizeof (cmsgmem));664 #endif665 #endif666 667 /* the socket is non-blocking668 * 'name' is the address of the sender socket669 */670 725 do { 671 talkfd = accept(pf_unix_fd, (struct sockaddr *) &name, &size); 672 } while (talkfd < 0 && errno == EINTR); 673 674 if ((talkfd < 0) && (errno == EAGAIN)) 675 { 676 return 0; 677 } 678 else if (talkfd < 0) 679 { 680 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 681 sh_error_message (errno, errbuf, sizeof(errbuf)), 682 _("sh_socket_read: accept")); 683 return -1; 684 } 685 686 687 #if defined(LOCAL_CREDS) && !defined(SO_PEERCRED) && !defined(HAVE_GETPEEREID) 688 /* Set the socket to receive credentials on the next message 689 */ 690 { 691 int on = 1; 692 if (setsockopt (talkfd, 0, LOCAL_CREDS, &on, sizeof (on)) < 0) 693 { 694 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 695 sh_error_message (errno, errbuf, sizeof(errbuf)), 696 _("sh_socket_read: setsockopt")); 697 sl_close_fd(FIL__, __LINE__, talkfd); 698 return -1; 699 } 700 } 701 #endif 702 703 do { 704 nbytes = recvmsg (talkfd, &msg, 0); 726 nbytes = recvmsg (talkfd, msg, 0); 705 727 if ((nbytes < 0) && (errno != EAGAIN)) 706 728 { … … 718 740 } while ((nbytes < 0) && (retry < 3)); 719 741 720 #ifdef SH_DEBUG_SOCKET721 fprintf(stderr, "%d bytes received\n", nbytes);722 #endif723 724 742 /* msg.msg_iov.iov_base, filled by recvmsg 725 743 */ 726 message[ sizeof(message)-1] = '\0';744 message[message_size-1] = '\0'; 727 745 728 746 if (nbytes < 0) … … 731 749 { 732 750 /* no data */ 751 sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, errno, MSG_E_SUBGEN, 752 sh_error_message (errno, errbuf, sizeof(errbuf)), 753 _("sh_socket_read: recvfrom")); 733 754 sl_close_fd(FIL__, __LINE__, talkfd); 734 755 return 0; … … 740 761 return -1; 741 762 } 763 return 0; 764 } 742 765 743 766 #if defined(HAVE_GETPEEREID) 767 768 static int get_peer_uid(int talkfd) 769 { 770 uid_t peer_uid; 771 gid_t peer_gid; 772 char errbuf[SH_ERRBUF_SIZE]; 773 744 774 if (0 != getpeereid(talkfd, &peer_uid, &peer_gid)) 745 775 { … … 750 780 return -1; 751 781 } 752 client_uid = peer_uid; 753 cmd = message; 754 #elif defined(SO_PEERCRED) 782 return peer_uid; 783 } 784 785 #elif defined(SO_PEERCRED) 786 787 static int get_peer_uid(int talkfd) 788 { 789 char errbuf[SH_ERRBUF_SIZE]; 790 struct ucred cr; 791 #ifdef HAVE_SOCKLEN_T 792 socklen_t cl = sizeof(cr); 793 #else 794 int cl = sizeof(cr); 795 #endif 796 755 797 if (0 != getsockopt(talkfd, SOL_SOCKET, SO_PEERCRED, &cr, &cl)) 756 798 { … … 761 803 return -1; 762 804 } 763 client_uid = cr.uid; 764 cmd = message; 765 #elif defined(HAVE_STRUCT_CMSGCRED) || defined(HAVE_STRUCT_FCRED) || (defined(HAVE_STRUCT_SOCKCRED) && defined(LOCAL_CREDS)) 766 if (cmsg->cmsg_len < sizeof (cmsgmem) || cmsg->cmsg_type != SCM_CREDS) 767 { 768 sh_error_handle((-1), FIL__, __LINE__, 0, MSG_E_SUBGEN, 769 _("Message from recvmsg() was not SCM_CREDS"), 770 _("sh_socket_read")); 771 772 /* Check for file descriptors sent using SCM_RIGHTS, and 773 * close them. If MSG_CTRUNC is set, the buffer was too small, 774 * and no fds are duped. 775 */ 776 if (msg.msg_controllen >= sizeof(struct cmsghdr) && 777 (msg.msg_flags & MSG_CTRUNC) == 0) 778 { 779 unsigned int data_size; 780 unsigned int data_i; 781 int fdcount, fdmax; 782 struct cmsghdr * cmptr; 783 int fdsbuf[1 + (sizeof(cmsgmem)/sizeof(int))]; 784 785 for (cmptr = CMSG_FIRSTHDR(&msg); cmptr != NULL; 786 cmptr = CMSG_NXTHDR(&msg, cmptr)) 787 { 788 if (cmptr->cmsg_len > sizeof (cmsgmem) || 789 cmptr->cmsg_level != SOL_SOCKET || 790 cmptr->cmsg_type != SCM_RIGHTS) 791 continue; 792 793 /* Crappy way of finding the data length. 794 * cmptr->cmsg_len includes both header and padding, 795 * how are you supposed to find the data length? 796 * cmptr->cmsg_len - ALIGN(sizeof(struct cmsghdr)) ? 797 */ 798 data_size = 0; 799 800 for (data_i = 0; data_i < cmptr->cmsg_len; ++data_i) 801 { 802 if (CMSG_LEN(data_i) == cmptr->cmsg_len) 803 { 804 data_size = data_i; 805 break; 806 } 807 } 808 memcpy(fdsbuf, CMSG_DATA(cmptr), data_size); 809 fdmax = data_size / sizeof(int); 810 for (fdcount = 0; fdcount < fdmax; ++fdcount) 811 (void) sl_close_fd(FIL__, __LINE__, fdsbuf[fdcount]); 812 } 813 } 814 815 sl_close_fd(FIL__, __LINE__, talkfd); 816 return -1; 817 } 818 cred = (Cred *) CMSG_DATA (cmsg); 819 client_uid = cred->CRED_UID; 820 cmd = message; 821 #elif defined(NEED_PASSWORD_AUTH) 805 return cr.uid; 806 } 807 808 #endif 809 810 #if defined(NEED_PASSWORD_AUTH) 811 char * check_password(char * message, int * client_uid, int talkfd) 812 { 813 char * cmd = NULL; 814 char * eopw = NULL; 815 char * goodpassword = NULL; 816 822 817 goodpassword = sh_get_sockpass(); 823 818 eopw = strchr(message, '@'); … … 830 825 strlen(goodpassword) < (sizeof(message)/2)) 831 826 { 832 client_uid = sh_socket_flaguid;827 *client_uid = sh_socket_flaguid; 833 828 cmd = &message[strlen(goodpassword)+1]; 834 829 sh_set_sockpass(); … … 841 836 sh_set_sockpass(); 842 837 sl_close_fd(FIL__, __LINE__, talkfd); 838 return NULL; 839 } 840 return cmd; 841 } 842 #endif 843 844 static int list_all (int talkfd, char * cmd); 845 static int process_message(int talkfd, char * cmd, struct socket_cmd * srvcmd); 846 847 static 848 int sh_socket_read (struct socket_cmd * srvcmd) 849 { 850 char message[SH_MAXMSG]; 851 struct sockaddr_un name; 852 ACCEPT_TYPE_ARG3 size = sizeof(name); 853 int talkfd; 854 char * cmd = NULL; 855 int client_uid = -1; 856 char errbuf[SH_ERRBUF_SIZE]; 857 struct msghdr msg; 858 struct iovec iov; 859 int status; 860 861 if (pf_unix_fd < 0) 862 return 0; 863 864 iov.iov_base = (char *) &message; 865 iov.iov_len = sizeof(message); 866 867 memset (&msg, 0, sizeof (msg)); 868 msg.msg_iov = &iov; 869 msg.msg_iovlen = 1; 870 871 /* the socket is non-blocking 872 * 'name' is the address of the sender socket 873 */ 874 do { 875 talkfd = accept(pf_unix_fd, (struct sockaddr *) &name, &size); 876 } while (talkfd < 0 && errno == EINTR); 877 878 if ((talkfd < 0) && (errno == EAGAIN)) 879 { 880 return 0; 881 } 882 else if (talkfd < 0) 883 { 884 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 885 sh_error_message (errno, errbuf, sizeof(errbuf)), 886 _("sh_socket_read: accept")); 843 887 return -1; 844 888 } 889 890 if (receive_message(talkfd, &msg, sizeof(message)) < 0) 891 return -1; 892 893 /* Authenticate request by peer uid or password. 894 */ 895 #if defined(HAVE_GETPEEREID) 896 client_uid = get_peer_uid(talkfd); 897 cmd = message; 898 899 #elif defined(SO_PEERCRED) 900 client_uid = get_peer_uid(talkfd); 901 cmd = message; 902 903 #elif defined(NEED_PASSWORD_AUTH) 904 cmd = check_password(message, &client_uid, talkfd); 905 845 906 #else 846 907 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, … … 851 912 #endif 852 913 853 #ifdef SH_DEBUG_SOCKET854 fprintf(stderr, "Peer uid=%d, required=%d\n",855 client_uid, sh_socket_flaguid);856 #endif857 858 914 if (client_uid != sh_socket_flaguid) 859 915 { … … 865 921 } 866 922 867 868 /* Give a diagnostic message. 869 */ 870 #ifdef SH_DEBUG_SOCKET 871 fprintf (stderr, "Server: got message: %s\n", cmd); 872 #endif 873 874 clt = strchr(cmd, ':'); 923 status = process_message(talkfd, cmd, srvcmd); 924 925 sl_close_fd(FIL__, __LINE__, talkfd); 926 return status; 927 } 928 929 static int check_valid_command(const char * str) 930 { 931 unsigned int i = 0; 932 char * commands[] = { N_("DELTA"), N_("RELOAD"), N_("STOP"), N_("SCAN"), 933 N_("CANCEL"), N_("LISTALL"), N_("LIST"), N_("PROBE"), NULL }; 934 935 while (commands[i]) 936 { 937 if (0 == strcmp(_(commands[i]), str)) 938 { 939 return 0; 940 } 941 ++i; 942 } 943 return -1; 944 } 945 946 static int send_reply (int fd, char * msg) 947 { 948 int nbytes = send (fd, msg, strlen(msg) + 1, 0); 949 950 if (nbytes < 0) 951 { 952 char errbuf[SH_ERRBUF_SIZE]; 953 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 954 sh_error_message (errno, errbuf, sizeof(errbuf)), 955 _("send_reply")); 956 return -1; 957 } 958 959 return nbytes; 960 } 961 962 static int process_message(int talkfd, char * cmd, struct socket_cmd * srvcmd) 963 { 964 int nbytes; 965 char error_type[SH_ERRBUF_SIZE] = { '\0' }; 966 char * clt = (cmd) ? strchr(cmd, ':') : NULL; 967 968 if (clt && 0 == strncmp(cmd, _("DELTA:"), 6)) 969 { 970 /* DELTA:uuid:hostname 971 */ 972 char * uuid = clt; 973 974 *uuid = '\0'; ++uuid; 975 clt = strchr(uuid, ':'); 976 if (clt) { *clt = '\0'; ++clt; } 977 978 if (sh_uuid_check(uuid) < 0) 979 { 980 sl_strlcpy(error_type, _("!E:uuid-format:"), sizeof(error_type)); 981 sl_strlcat(error_type, uuid, sizeof(error_type)); 982 clt = NULL; 983 } 984 985 --uuid; *uuid = ':'; 986 } 987 else if (clt && *clt == ':') 988 { 989 *clt = '\0'; ++clt; 990 if (check_valid_command(cmd) < 0) 991 { 992 sl_strlcpy(error_type, _("!E:cmd-invalid:"), sizeof(error_type)); 993 sl_strlcat(error_type, cmd, sizeof(error_type)); 994 clt = NULL; 995 } 996 } 997 875 998 if (clt != NULL) 876 999 { 877 *clt = '\0'; ++clt;878 1000 if (sl_strlen(cmd) >= SH_MAXMSGLEN) 879 1001 { 880 #ifdef SH_DEBUG_SOCKET881 fprintf (stderr, "Server: command too long: %s\n", cmd);882 #endif883 1002 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 884 1003 _("Bad message format: command too long"), 885 1004 _("sh_socket_read")); 886 sl_close_fd(FIL__, __LINE__, talkfd); 1005 sl_strlcpy(error_type, _("!E:cmd-toolong"), sizeof(error_type)); 1006 send_reply(talkfd, error_type); 887 1007 return -1; 888 1008 } 889 1009 else if (sl_strlen(clt) >= SH_MAXMSGLEN) 890 1010 { 891 #ifdef SH_DEBUG_SOCKET892 fprintf (stderr, "Server: hostname too long: %s\n", clt);893 #endif894 1011 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 895 1012 _("Bad message format: hostname too long"), 896 1013 _("sh_socket_read")); 897 sl_close_fd(FIL__, __LINE__, talkfd); 1014 sl_strlcpy(error_type, _("!E:hostname-toolong"), sizeof(error_type)); 1015 send_reply(talkfd, error_type); 898 1016 return -1; 899 1017 } 900 if (cmd[0] == 'L' && cmd[1] == 'I' && 901 cmd[2] == 'S' && cmd[3] == 'T') 902 { 903 #ifdef SH_DEBUG_SOCKET 904 fprintf (stderr, "Server: list %s\n", clt); 905 #endif 906 goto list_all; 907 } 908 else if (cmd[0] == 'P' && cmd[1] == 'R' && 909 cmd[2] == 'O' && cmd[3] == 'B' && cmd[4] == 'E') 910 { 911 #ifdef SH_DEBUG_SOCKET 912 fprintf (stderr, "Server: probe start %s\n", clt); 913 #endif 1018 1019 if (0 == strncmp(cmd, _("LIST"), 4)) 1020 return list_all(talkfd, cmd); 1021 else if (0 == strncmp(cmd, _("PROBE"), 4)) 1022 { 914 1023 sh_socket_probe4reload(); 915 #ifdef SH_DEBUG_SOCKET 916 fprintf (stderr, "Server: probe done %s\n", clt); 917 #endif 918 cmd[0] = 'L'; cmd[1] = 'I'; cmd[2] = 'S'; cmd[3] = 'T';cmd[4] = '\0'; 919 goto list_all; 920 } 1024 sl_strlcpy(cmd, _("LIST"), 5); 1025 return list_all(talkfd, cmd); 1026 } 1027 921 1028 sl_strlcpy (srvcmd->cmd, cmd, SH_MAXMSGLEN); 922 1029 sl_strlcpy (srvcmd->clt, clt, SH_MAXMSGLEN); … … 925 1032 else 926 1033 { 927 #ifdef SH_DEBUG_SOCKET928 fprintf (stderr, "Server: bad message\n");929 #endif930 1034 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 931 1035 _("Bad message format"), 932 1036 _("sh_socket_read")); 933 sl_close_fd(FIL__, __LINE__, talkfd); 1037 if (error_type[0] == '\0') 1038 sl_strlcpy(error_type, _("!E:message-format"), sizeof(error_type)); 1039 send_reply(talkfd, error_type); 934 1040 return -1; 935 1041 } 936 1042 937 1043 /* Bounce the message back to the sender. 938 * 'name' is the receiver address; it has been been filled939 * with the sender address in the recvfrom call940 1044 */ 941 #ifdef SH_DEBUG_SOCKET 942 fprintf (stderr, "Server: send message: %s to %s\n", 943 cmd, name.sun_path); 944 #endif 945 /* 946 nbytes = sendto (pf_unix_fd, message, nbytes, 0, 947 (struct sockaddr *) & name, size); 948 */ 949 nbytes = send (talkfd, cmd, strlen(cmd) + 1, 0); 950 sl_close_fd(FIL__, __LINE__, talkfd); 951 if (nbytes < 0) 952 { 953 sh_error_handle((-1), FIL__, __LINE__, errno, MSG_E_SUBGEN, 954 sh_error_message (errno, errbuf, sizeof(errbuf)), 955 _("sh_socket_read: send")); 956 return -1; 957 } 958 #ifdef SH_DEBUG_SOCKET 959 fprintf (stderr, "Server: message is out\n"); 960 #endif 1045 nbytes = send_reply(talkfd, cmd); 1046 961 1047 return nbytes; 962 963 list_all: 964 #ifdef SH_DEBUG_SOCKET 965 fprintf (stderr, "Server: list all\n"); 966 #endif 967 if (cmd[4] == 'A' && cmd[5] == 'L' && cmd[6] == 'L') 1048 } 1049 1050 static int list_all (int talkfd, char * cmd) 1051 { 1052 int nbytes; 1053 struct socket_cmd * list_cmd; 1054 char message[SH_MAXMSG]; 1055 char errbuf[SH_ERRBUF_SIZE]; 1056 1057 if (0 == strncmp(cmd, _("LISTALL"), 7)) 968 1058 { 969 1059 list_cmd = runlist; 970 1060 while (list_cmd) 971 1061 { 972 sl_snprintf(message, sizeof(message), _("SENT % 8s %32s %s"),1062 sl_snprintf(message, sizeof(message), _("SENT %42s %32s %s"), 973 1063 list_cmd->cmd, list_cmd->clt, list_cmd->cti); 974 /* 975 sl_strlcpy(message, _("DONE"), SH_MAXMSG); 976 sl_strlcat(message, " ", SH_MAXMSG); 977 sl_strlcat(message, list_cmd->cmd, SH_MAXMSG); 978 sl_strlcat(message, " ", SH_MAXMSG); 979 sl_strlcat(message, list_cmd->clt, SH_MAXMSG); 980 sl_strlcat(message, " ", SH_MAXMSG); 981 sl_strlcat(message, list_cmd->cti, SH_MAXMSG); 982 */ 1064 983 1065 nbytes = send (talkfd, message, sl_strlen(message) + 1, 0); 984 1066 if (nbytes < 0) … … 987 1069 sh_error_message (errno, errbuf, sizeof(errbuf)), 988 1070 _("sh_socket_read: sendto")); 989 sl_close_fd(FIL__, __LINE__, talkfd);990 1071 return -1; 991 1072 } … … 997 1078 while (list_cmd) 998 1079 { 999 sl_snprintf(message, sizeof(message), _(">>>> % 8s %32s %s"),1080 sl_snprintf(message, sizeof(message), _(">>>> %42s %32s %s"), 1000 1081 list_cmd->cmd, list_cmd->clt, list_cmd->cti); 1001 /* 1002 sl_strlcpy(message, _(">>>>"), SH_MAXMSG); 1003 sl_strlcat(message, " ", SH_MAXMSG); 1004 sl_strlcat(message, list_cmd->cmd, SH_MAXMSG); 1005 sl_strlcat(message, " ", SH_MAXMSG); 1006 sl_strlcat(message, list_cmd->clt, SH_MAXMSG); 1007 sl_strlcat(message, " ", SH_MAXMSG); 1008 sl_strlcat(message, list_cmd->cti, SH_MAXMSG); 1009 */ 1010 /* 1011 nbytes = sendto (pf_unix_fd, message, sl_strlen(message) + 1, 0, 1012 (struct sockaddr *) & name, size); 1013 */ 1082 1014 1083 nbytes = send (talkfd, message, sl_strlen(message) + 1, 0); 1015 1084 if (nbytes < 0) … … 1018 1087 sh_error_message (errno, errbuf, sizeof(errbuf)), 1019 1088 _("sh_socket_read: sendto")); 1020 sl_close_fd(FIL__, __LINE__, talkfd);1021 1089 return -1; 1022 1090 } … … 1024 1092 } 1025 1093 1026 /* 1027 nbytes = sendto (pf_unix_fd, _("END"), 4, 0, 1028 (struct sockaddr *) & name, size); 1029 */ 1030 /* nbytes = *//* never read */ send (talkfd, _("END"), 4, 0); 1031 sl_close_fd(FIL__, __LINE__, talkfd); 1094 send (talkfd, _("END"), 4, 0); 1032 1095 return 0; 1033 1096 } 1034 /* #if !defined(HAVE_CMSGCRED) || !defined(SO_PEERCRED) */1035 /* #endif */1036 1097 1037 1098 static void sh_socket_add2list (struct socket_cmd * in) 1038 1099 { 1039 struct socket_cmd * new; 1040 1041 new = SH_ALLOC(sizeof(struct socket_cmd)); 1042 sl_strlcpy (new->cmd, in->cmd, sizeof(new->cmd)); 1043 sl_strlcpy (new->clt, in->clt, sizeof(new->clt)); 1044 #ifdef SH_DEBUG_SOCKET 1045 fprintf(stderr, "add2list: time set for %s\n", new->clt); 1046 #endif 1047 (void) sh_unix_time(0, new->cti, sizeof(new->cti)); 1048 new->next = cmdlist; 1049 cmdlist = new; 1050 1051 return; 1052 } 1053 1054 static void sh_socket_add2run (struct socket_cmd * in) 1055 { 1056 struct socket_cmd * new = runlist; 1057 char * client_name = in->clt; 1100 struct socket_cmd * new = cmdlist; 1101 struct socket_cmd * last = cmdlist; 1058 1102 1059 1103 while (new) 1060 1104 { 1061 if (0 == sl_strcmp(new->clt, client_name)) 1062 { 1063 sl_strlcpy (new->cmd, in->cmd, sizeof(new->cmd)); 1064 sl_strlcpy (new->clt, in->clt, sizeof(new->clt)); 1065 #ifdef SH_DEBUG_SOCKET 1066 fprintf(stderr, "add2run: time reset for %s\n", new->clt); 1067 #endif 1105 /* Only skip identical commands. 1106 */ 1107 if (0 == sl_strcmp(new->clt, in->clt) && 1108 0 == sl_strcmp(new->cmd, in->cmd)) 1109 { 1068 1110 (void) sh_unix_time(0, new->cti, sizeof(new->cti)); 1069 1111 return; … … 1073 1115 1074 1116 new = SH_ALLOC(sizeof(struct socket_cmd)); 1075 sl_strlcpy (new->cmd, in->cmd, sizeof(new->cmd)); 1076 sl_strlcpy (new->clt, in->clt, sizeof(new->clt)); 1117 sl_strlcpy (new->cmd, in->cmd, sizeof(new->cmd)); 1118 sl_strlcpy (new->clt, in->clt, sizeof(new->clt)); 1119 (void) sh_unix_time(0, new->cti, sizeof(new->cti)); 1120 new->next = NULL; 1121 1122 if (last) 1123 { 1124 while (last->next) { last = last->next; } 1125 last->next = new; 1126 } 1127 else 1128 { 1129 cmdlist = new; 1130 } 1131 return; 1132 } 1133 1134 static void sh_socket_add2run (struct socket_cmd * in) 1135 { 1136 struct socket_cmd * new = runlist; 1137 struct socket_cmd * last = runlist; 1138 1139 while (new) 1140 { 1141 /* Only skip identical commands. First 5 will 1142 * make all 'DELTA' identical. 1143 */ 1144 if (0 == sl_strcmp(new->clt, in->clt) && 1145 0 == sl_strncmp(new->cmd, in->cmd, 5)) 1146 { 1147 sl_strlcpy (new->cmd, in->cmd, sizeof(new->cmd)); 1148 (void) sh_unix_time(0, new->cti, sizeof(new->cti)); 1149 return; 1150 } 1151 new = new->next; 1152 } 1153 1154 new = SH_ALLOC(sizeof(struct socket_cmd)); 1155 sl_strlcpy (new->cmd, in->cmd, sizeof(new->cmd)); 1156 sl_strlcpy (new->clt, in->clt, sizeof(new->clt)); 1077 1157 #ifdef SH_DEBUG_SOCKET 1078 1158 fprintf(stderr, "add2run: time set for %s\n", new->clt); 1079 1159 #endif 1080 1160 (void) sh_unix_time(0, new->cti, sizeof(new->cti)); 1081 new->next = runlist; 1082 runlist = new; 1083 1161 new->next = NULL; 1162 1163 if (last) 1164 { 1165 while (last->next) { last = last->next; } 1166 last->next = new; 1167 } 1168 else 1169 { 1170 runlist = new; 1171 } 1084 1172 return; 1085 1173 } … … 1087 1175 1088 1176 1089 static void sh_socket_rm2list (const char * client_name )1177 static void sh_socket_rm2list (const char * client_name, int remove_all) 1090 1178 { 1091 1179 struct socket_cmd * old = cmdlist; … … 1098 1186 if ((new == cmdlist) && (new->next == NULL)) 1099 1187 { 1188 /* There is only one entry */ 1100 1189 cmdlist = NULL; 1101 1190 SH_FREE(new); … … 1104 1193 else if (new == cmdlist) 1105 1194 { 1195 /* first entry: new = old = cmdlist */ 1106 1196 cmdlist = new->next; 1107 1197 SH_FREE(new); 1108 return; 1198 if (remove_all == S_FALSE) 1199 return; 1200 old = cmdlist; 1201 new = cmdlist; 1202 continue; 1109 1203 } 1110 1204 else … … 1112 1206 old->next = new->next; 1113 1207 SH_FREE(new); 1114 return; 1208 if (remove_all == S_FALSE) 1209 return; 1210 new = old; 1115 1211 } 1116 1212 } … … 1131 1227 1132 1228 if (pf_unix_fd < 0) 1133 { 1134 return 0; 1135 } 1229 return 0; 1136 1230 1137 1231 sl_strlcpy(cancel_cmd, _("CANCEL"), sizeof(cancel_cmd)); … … 1140 1234 { 1141 1235 if (0 == sl_strcmp(cmd.cmd, cancel_cmd)) 1142 { 1143 sh_socket_rm2list (cmd.clt); 1144 } 1236 sh_socket_rm2list (cmd.clt, S_TRUE); 1145 1237 else 1146 { 1147 sh_socket_rm2list (cmd.clt); 1148 sh_socket_add2list (&cmd); 1149 } 1238 sh_socket_add2list (&cmd); 1150 1239 } 1151 1240 return 0; … … 1164 1253 if (0 == sl_strcmp(new->clt, client_name)) 1165 1254 { 1166 sl_strlcpy(out, new->cmd,sizeof(out));1255 sl_strlcpy(out, new->cmd, sizeof(out)); 1167 1256 sh_socket_add2run (new); 1168 sh_socket_rm2list (client_name);1257 sh_socket_rm2list (client_name, S_FALSE); 1169 1258 return out; 1170 1259 } … … 1173 1262 return NULL; 1174 1263 } 1175 1176 1264 /* #if defined (SH_WITH_SERVER) 1177 1265 */ 1178 1266 #endif 1179 1267 1268 1269 #ifdef SH_CUTEST 1270 #include "CuTest.h" 1271 1272 void Test_cmdlist (CuTest *tc) { 1273 1274 #if defined (SH_WITH_SERVER) 1275 struct socket_cmd cmd; 1276 char * p; 1277 1278 sl_strlcpy(cmd.clt, "one", sizeof(cmd.clt)); 1279 sl_strlcpy(cmd.cmd, "RELOAD", sizeof(cmd.cmd)); 1280 1281 sh_socket_add2list (&cmd); 1282 p = sh_socket_check("one"); 1283 CuAssertPtrNotNull(tc, p); 1284 CuAssertStrEquals(tc, "RELOAD", p); 1285 1286 p = sh_socket_check("one"); 1287 CuAssertPtrEquals(tc, NULL, p); 1288 1289 sh_socket_add2list (&cmd); 1290 sl_strlcpy(cmd.cmd, "STOP", sizeof(cmd.cmd)); 1291 sh_socket_add2list (&cmd); 1292 1293 sl_strlcpy(cmd.clt, "two", sizeof(cmd.clt)); 1294 sl_strlcpy(cmd.cmd, "STOP", sizeof(cmd.cmd)); 1295 sh_socket_add2list (&cmd); 1296 sl_strlcpy(cmd.clt, "three", sizeof(cmd.clt)); 1297 sl_strlcpy(cmd.cmd, "STOP", sizeof(cmd.cmd)); 1298 sh_socket_add2list (&cmd); 1299 1300 sl_strlcpy(cmd.clt, "one", sizeof(cmd.clt)); 1301 sl_strlcpy(cmd.cmd, "DELTA", sizeof(cmd.cmd)); 1302 sh_socket_add2list (&cmd); 1303 1304 p = sh_socket_check("one"); 1305 CuAssertPtrNotNull(tc, p); 1306 CuAssertStrEquals(tc, "RELOAD", p); 1307 1308 sl_strlcpy(cmd.clt, "two", sizeof(cmd.clt)); 1309 sl_strlcpy(cmd.cmd, "RELOAD", sizeof(cmd.cmd)); 1310 sh_socket_add2list (&cmd); 1311 sl_strlcpy(cmd.clt, "three", sizeof(cmd.clt)); 1312 sl_strlcpy(cmd.cmd, "RELOAD", sizeof(cmd.cmd)); 1313 sh_socket_add2list (&cmd); 1314 1315 p = sh_socket_check("one"); 1316 CuAssertPtrNotNull(tc, p); 1317 CuAssertStrEquals(tc, "STOP", p); 1318 p = sh_socket_check("one"); 1319 CuAssertPtrNotNull(tc, p); 1320 CuAssertStrEquals(tc, "DELTA", p); 1321 p = sh_socket_check("one"); 1322 CuAssertPtrEquals(tc, NULL, p); 1323 1324 /* Test removal in correct order */ 1325 sl_strlcpy(cmd.clt, "one", sizeof(cmd.clt)); 1326 sl_strlcpy(cmd.cmd, "RELOAD", sizeof(cmd.cmd)); 1327 sh_socket_add2list (&cmd); 1328 sl_strlcpy(cmd.cmd, "STOP", sizeof(cmd.cmd)); 1329 sh_socket_add2list (&cmd); 1330 sl_strlcpy(cmd.cmd, "DELTA", sizeof(cmd.cmd)); 1331 sh_socket_add2list (&cmd); 1332 sl_strlcpy(cmd.cmd, "FOOBAR", sizeof(cmd.cmd)); 1333 sh_socket_add2list (&cmd); 1334 1335 sh_socket_rm2list ("one", S_FALSE); 1336 1337 p = sh_socket_check("one"); 1338 CuAssertPtrNotNull(tc, p); 1339 CuAssertStrEquals(tc, "STOP", p); 1340 1341 sh_socket_rm2list ("one", S_FALSE); 1342 1343 p = sh_socket_check("one"); 1344 CuAssertPtrNotNull(tc, p); 1345 CuAssertStrEquals(tc, "FOOBAR", p); 1346 1347 p = sh_socket_check("one"); 1348 CuAssertPtrEquals(tc, NULL, p); 1349 1350 sl_strlcpy(cmd.clt, "one", sizeof(cmd.clt)); 1351 sl_strlcpy(cmd.cmd, "RELOAD", sizeof(cmd.cmd)); 1352 sh_socket_add2list (&cmd); 1353 sl_strlcpy(cmd.cmd, "STOP", sizeof(cmd.cmd)); 1354 sh_socket_add2list (&cmd); 1355 1356 sl_strlcpy(cmd.clt, "two", sizeof(cmd.clt)); 1357 sl_strlcpy(cmd.cmd, "RELOAD", sizeof(cmd.cmd)); 1358 sh_socket_add2list (&cmd); 1359 sl_strlcpy(cmd.clt, "three", sizeof(cmd.clt)); 1360 sl_strlcpy(cmd.cmd, "RELOAD", sizeof(cmd.cmd)); 1361 sh_socket_add2list (&cmd); 1362 1363 sl_strlcpy(cmd.clt, "one", sizeof(cmd.clt)); 1364 sl_strlcpy(cmd.cmd, "DELTA", sizeof(cmd.cmd)); 1365 sh_socket_add2list (&cmd); 1366 sl_strlcpy(cmd.cmd, "FOOBAR", sizeof(cmd.cmd)); 1367 sh_socket_add2list (&cmd); 1368 1369 sh_socket_rm2list ("one", S_TRUE); 1370 p = sh_socket_check("one"); 1371 CuAssertPtrEquals(tc, NULL, p); 1372 1373 p = sh_socket_check("two"); 1374 CuAssertPtrNotNull(tc, p); 1375 CuAssertStrEquals(tc, "STOP", p); 1376 p = sh_socket_check("two"); 1377 CuAssertPtrNotNull(tc, p); 1378 CuAssertStrEquals(tc, "RELOAD", p); 1379 p = sh_socket_check("two"); 1380 CuAssertPtrEquals(tc, NULL, p); 1381 1382 p = sh_socket_check("three"); 1383 CuAssertPtrNotNull(tc, p); 1384 CuAssertStrEquals(tc, "STOP", p); 1385 p = sh_socket_check("three"); 1386 CuAssertPtrNotNull(tc, p); 1387 CuAssertStrEquals(tc, "RELOAD", p); 1388 p = sh_socket_check("three"); 1389 CuAssertPtrEquals(tc, NULL, p); 1390 1391 p = sh_socket_check("four"); 1392 CuAssertPtrEquals(tc, NULL, p); 1393 #else 1394 (void) tc; 1395 #endif 1396 } 1397 1398 #endif /* #ifdef SH_CUTEST */ 1399 1400 1401 -
trunk/src/sh_static.c
r473 r481 999 999 return -1; 1000 1000 1001 while ((l = data[offset++])) { 1001 while ((l = data[offset])) { 1002 1003 if (offset < INT_MAX) 1004 offset++; 1005 else 1006 return -1; 1002 1007 1003 1008 if ((l & 0xc0) == (0xc0)) { 1004 offset++; 1009 if (offset < INT_MAX) 1010 offset++; 1011 else 1012 return -1; 1005 1013 break; 1006 1014 } 1007 1015 1008 offset += l; 1016 if (offset <= (INT_MAX - l)) 1017 offset += l; 1018 else 1019 return -1; 1009 1020 } 1010 1021 … … 1019 1030 if (i < 0) 1020 1031 return i; 1021 1022 return i + 4; 1032 if (i < (INT_MAX - 4)) 1033 return i + 4; 1034 else 1035 return -1; 1023 1036 } 1024 1037 … … 1036 1049 if (!data) 1037 1050 return -1; 1038 1039 while ((l=data[offset++])) { 1040 if (measure) 1051 while ((l=data[offset])) { 1052 if (offset < INT_MAX) offset++; 1053 else return -1; 1054 if (measure && (total < INT_MAX)) 1041 1055 total++; 1042 1056 if ((l & 0xc0) == (0xc0)) { 1043 if (measure)1057 if (measure && (total < INT_MAX)) 1044 1058 total++; 1045 /* compressed item, redirect */1059 /* compressed item, redirect */ 1046 1060 offset = ((l & 0x3f) << 8) | data[offset]; 1061 if (offset < 0) 1062 return -1; 1047 1063 measure = 0; 1048 1064 continue; 1049 1065 } 1066 1067 if (used >= (INT_MAX - l)) 1068 return -1; 1050 1069 1051 1070 if ((used + l + 1) >= maxlen) 1052 return -1;1071 return -1; 1053 1072 1054 1073 memcpy(dest + used, data + offset, l); 1055 offset += l; 1056 used += l; 1057 if (measure) 1074 1075 if (offset <= (INT_MAX - l)) 1076 offset += l; 1077 else 1078 return -1; 1079 1080 if (used <= (INT_MAX - l)) 1081 used += l; 1082 else 1083 return -1; 1084 if (measure && (total <= (INT_MAX - l))) 1058 1085 total += l; 1059 1086 1087 if (used == INT_MAX) 1088 return -1; 1060 1089 if (data[offset] != 0) 1061 1090 dest[used++] = '.'; … … 1065 1094 1066 1095 /* The null byte must be counted too */ 1067 if (measure ) {1096 if (measure && (total < INT_MAX)) { 1068 1097 total++; 1069 1098 } … … 1078 1107 { 1079 1108 char temp[256]; 1080 int i ;1109 int i = 0; 1081 1110 1082 1111 i = __decode_dotted(message, offset, temp, sizeof(temp)); … … 1084 1113 return i; 1085 1114 1086 message += offset + i; 1115 if (offset <= (INT_MAX - i)) 1116 message += offset + i; 1117 else 1118 return -1; 1087 1119 1088 1120 a->dotted = strdup(temp); … … 1101 1133 DPRINTF("i=%d,rdlength=%d\n", i, a->rdlength); 1102 1134 1103 return i + RRFIXEDSZ + a->rdlength; 1135 if (RRFIXEDSZ <= (INT_MAX - i)) 1136 i += RRFIXEDSZ; 1137 else 1138 return -1; 1139 if (a->rdlength <= (INT_MAX - i)) 1140 return i + a->rdlength; 1141 else 1142 return -1; 1104 1143 } 1105 1144 … … 1148 1187 1149 1188 dest += i; 1189 if (maxlen < i) 1190 return -1; 1150 1191 maxlen -= i; 1151 1192 … … 1158 1199 dest[3] = (q->qclass & 0x00ff) >> 0; 1159 1200 1160 return i + 4; 1201 if (i <= (INT_MAX - 4)) 1202 return i + 4; 1203 else 1204 return -1; 1161 1205 } 1162 1206 -
trunk/src/sh_string.c
r383 r481 13 13 14 14 extern int sl_ok_adds (size_t a, size_t b); 15 #define S L_TRUE 116 #define S L_FALSE 015 #define S_TRUE 1 16 #define S_FALSE 0 17 17 18 18 #include <ctype.h> … … 389 389 sh_string * sh_string_cat_lchar(sh_string * s, const char * str, size_t len) 390 390 { 391 if (sl_ok_adds(len, s->siz) == S L_TRUE)391 if (sl_ok_adds(len, s->siz) == S_TRUE) 392 392 { 393 393 if ((len + 1 + s->len) > s->siz) … … 453 453 size_t len = 0; 454 454 455 if (sl_ok_adds(len1, len2) == S L_TRUE)455 if (sl_ok_adds(len1, len2) == S_TRUE) 456 456 len = len1 + len2; 457 457 else 458 458 return NULL; 459 if (sl_ok_adds( len, len3) == S L_TRUE)459 if (sl_ok_adds( len, len3) == S_TRUE) 460 460 len = len + len3; 461 461 else … … 482 482 increase = SH_STRING_PARCEL; 483 483 484 if (s && sl_ok_adds(s->siz, increase) == S L_TRUE)484 if (s && sl_ok_adds(s->siz, increase) == S_TRUE) 485 485 { 486 486 new = SH_ALLOC(s->siz + increase); -
trunk/src/sh_sub.c
r429 r481 83 83 close (child2parent[0]); 84 84 85 /* fprintf(stderr, "FIXME kill_sub %d\n", (int) sh_child_pid); */86 87 85 /* Let's be rude. */ 88 86 kill(sh_child_pid, SIGKILL); … … 210 208 211 209 sh_child_pid = res; 212 213 /* fprintf(stderr, "FIXME create_sub %d\n", (int) sh_child_pid); */214 210 } 215 211 else … … 252 248 static ssize_t sh_sub_write(int fd, const void *buf, size_t count) 253 249 { 254 c har * mbuf = (char *) buf;250 const char * mbuf = (const char *) buf; 255 251 ssize_t rcount; 256 252 int ttl = 5; /* 0, 1, 9, 81, 729 millisec */ … … 296 292 do { 297 293 298 /* fprintf(stderr, "FIXME wait_com polling..\n"); */299 300 294 do { 301 295 ret = poll(&fds, 1, -1); … … 305 299 { 306 300 ret = sh_sub_read(parent2child[0], &inbuf, sizeof(inbuf)); 307 308 /*309 fprintf(stderr, "FIXME wait_com stat %s (%s)\n",310 inbuf.path, (inbuf.command == SH_COM_LSTAT) ? "lstat" : "stat");311 */312 301 313 302 if (ret == 0) … … 328 317 outbuf.errnum = errno; 329 318 330 /* fprintf(stderr, "FIXME wait_com writing..\n"); */331 332 319 ret = sh_sub_write(child2parent[1], &outbuf, sizeof(outbuf)); 333 320 if (ret < 0) 334 321 { 335 /* fprintf(stderr, "FIXME wait_com return 1\n"); */336 322 return; 337 323 } … … 339 325 else /* sh_sub_read() < 0 */ 340 326 { 341 /* fprintf(stderr, "FIXME wait_com return 2\n"); */342 327 return; 343 328 } 344 329 } 345 346 /* fprintf(stderr, "FIXME wait_com next..\n"); */347 348 330 } while (1 == 1); 349 331 } -
trunk/src/sh_suidchk.c
r474 r481 78 78 #include "sh_suidchk.h" 79 79 #include "sh_hash.h" 80 #include "sh_dbIO.h" 80 81 #include "sh_unix.h" 81 82 #include "sh_files.h" … … 140 141 static int ShSuidchkActive = S_TRUE; 141 142 static time_t ShSuidchkInterval = 7200; 142 static long ShSuidchkFps = 0;143 static unsigned long ShSuidchkFps = 0; 143 144 static int ShSuidchkNosuid = S_FALSE; 144 145 static int ShSuidchkYield = S_FALSE; … … 150 151 static time_t FileLimNow = 0; 151 152 static time_t FileLimStart = 0; 152 static long FileLimNum = 0;153 static long FileLimTotal = 0;153 static unsigned long FileLimNum = 0; 154 static unsigned long FileLimTotal = 0; 154 155 155 156 static sh_schedule_t * ShSuidchkSched = NULL; … … 1134 1135 /* Rate limit (Fps == Files per second) 1135 1136 */ 1136 if ((ShSuidchkFps > 0 && FileLimNum > ShSuidchkFps && FileLimTotal > 0)&&1137 if ((ShSuidchkFps > 0 && FileLimNum > ShSuidchkFps) && 1137 1138 (ShSuidchkYield == S_FALSE)) 1138 1139 { … … 1222 1223 int dummy; 1223 1224 int class; 1224 unsigned long check_ mask= 0;1225 unsigned long check_flags = 0; 1225 1226 1226 1227 theFile = SH_ALLOC(sizeof(file_type)); 1227 1228 1228 1229 (void) sl_strlcpy (theFile->fullpath, tmpcat, PATH_MAX); 1229 theFile->check_ mask= sh_files_maskof(SH_LEVEL_READONLY);1230 theFile->check_flags = sh_files_maskof(SH_LEVEL_READONLY); 1230 1231 CLEAR_SH_FFLAG_REPORTED(theFile->file_reported); 1231 1232 theFile->attr_string = NULL; 1232 1233 theFile->link_path = NULL; 1233 1234 1234 sh_files_search_file(tmpcat, &class, &check_mask, &dummy); 1235 if ((check_mask & MODI_PREL) != 0) 1236 { 1237 theFile->check_mask |= MODI_PREL; 1238 } 1235 sh_files_search_file(tmpcat, &class, &check_flags, &dummy); 1236 if ((check_flags & MODI_PREL) != 0) 1237 MODI_SET(theFile->check_flags, MODI_PREL); 1239 1238 1240 1239 status = sh_unix_getinfo (ShDFLevel[SH_ERR_T_RO], … … 1303 1302 /* Running init. Report on files detected. 1304 1303 */ 1305 sh_ hash_pushdata(theFile, fileHash); /* no call to sh_error_handle */1304 sh_dbIO_data_write (theFile, fileHash); /* no call to sh_error_handle */ 1306 1305 SH_MUTEX_LOCK(mutex_thread_nolog); 1307 1306 sh_error_handle ((-1), FIL__, __LINE__, … … 2215 2214 } 2216 2215 2217 /* This variable is not used anywhere. It only exists2218 * to assign &dirlist to it, which keeps gcc from2219 * putting it into a register, and avoids the 'clobbered2220 * by longjmp' warning. And no, 'volatile' proved insufficient.2221 */2222 static void * sh_dummy_type = NULL;2223 2224 2225 2216 /* Return a newly allocated string naming the type of filesystem that the 2226 2217 file PATH, described by STATP, is on. 2227 2218 RELPATH is the file name relative to the current directory. 2228 2219 Return "unknown" if its filesystem type is unknown. */ 2220 2221 void * sh_dummy_2229_type; 2229 2222 2230 2223 static char * … … 2243 2236 FILE *mfp; 2244 2237 struct mntent *mnt; 2238 2239 /* Take the address to keep gcc from putting it into a register. 2240 * Avoids the 'clobbered by longjmp' warning. 2241 */ 2242 sh_dummy_2229_type = (void *) &type; 2245 2243 2246 2244 if (path == NULL || relpath == NULL) … … 2257 2255 return NULL; 2258 2256 } 2259 2260 /* Take the address to keep gcc from putting it into a register.2261 * Avoids the 'clobbered by longjmp' warning.2262 */2263 sh_dummy_type = (void*) &type;2264 2257 2265 2258 /* Find the entry with the same device number as STATP, and return -
trunk/src/sh_tiger0.c
r444 r481 55 55 #endif 56 56 57 #if defined(__GNUC__) && (__GNUC__ >= 3) 58 #undef SH_GNUC_ALIGN8 59 #define SH_GNUC_ALIGN8 __attribute__((aligned(8))) 60 #else 61 #undef SH_GNUC_ALIGN8 62 #define SH_GNUC_ALIGN8 63 #endif 64 65 57 66 typedef unsigned char sh_byte; 58 67 … … 121 130 char * tmp; 122 131 sh_byte * bptr; 123 sh_byte bbuf[64];132 sh_byte SH_GNUC_ALIGN8 bbuf[64]; 124 133 UINT64 bcount = 0; 125 134 … … 186 195 187 196 #if defined(HAVE_MLOCK) && !defined(HAVE_BROKEN_MLOCK) 188 if (skey->mlock_failed == S L_FALSE)197 if (skey->mlock_failed == S_FALSE) 189 198 { 190 199 if ( (-1) == sh_unix_mlock(FIL__, __LINE__, … … 193 202 { 194 203 SH_MUTEX_LOCK_UNSAFE(mutex_skey); 195 skey->mlock_failed = S L_TRUE;204 skey->mlock_failed = S_TRUE; 196 205 SH_MUTEX_UNLOCK_UNSAFE(mutex_skey); 197 206 } 198 207 } 199 208 #else 200 if (skey->mlock_failed == S L_FALSE)209 if (skey->mlock_failed == S_FALSE) 201 210 { 202 211 SH_MUTEX_LOCK_UNSAFE(mutex_skey); 203 skey->mlock_failed = S L_TRUE;212 skey->mlock_failed = S_TRUE; 204 213 SH_MUTEX_UNLOCK_UNSAFE(mutex_skey); 205 214 } … … 215 224 { 216 225 if (timeout > 0) 217 count = sl_read_timeout (fd, buffer, PRIV_MAX, timeout, S L_TRUE);226 count = sl_read_timeout (fd, buffer, PRIV_MAX, timeout, S_TRUE); 218 227 else 219 228 count = sl_read (fd, buffer, PRIV_MAX); … … 903 912 904 913 n = (off_t) sl_read_timeout (fd, buffer + sum, 905 (size_t) BLOCKSIZE - sum, timeout, S L_FALSE);914 (size_t) BLOCKSIZE - sum, timeout, S_FALSE); 906 915 907 916 if (SL_ISERROR (n)) … … 1450 1459 do { 1451 1460 n = (off_t) sl_read_timeout(fd, buffer + sum, 1452 (size_t) BLOCKSIZE - sum, timeout, S L_FALSE);1461 (size_t) BLOCKSIZE - sum, timeout, S_FALSE); 1453 1462 1454 1463 if (SL_ISERROR (n)) … … 1609 1618 } 1610 1619 1620 void sh_tiger_get_mask_hashtype(unsigned long * mask) 1621 { 1622 if (hash_type == SH_TIGER192) 1623 *mask |= MODI_TIGER192; 1624 else if (hash_type == SH_SHA1) 1625 *mask |= MODI_SHA1; 1626 else if (hash_type == SH_MD5) 1627 *mask |= MODI_MD5; 1628 else if (hash_type == SH_SHA256) 1629 *mask |= MODI_SHA256; 1630 return; 1631 } 1632 1633 void sh_tiger_set_hashtype_mask(unsigned long mask) 1634 { 1635 unsigned long type = mask & MODI_HASHTYPE; 1636 1637 if (type == MODI_TIGER192) 1638 hash_type = SH_TIGER192; 1639 else if (type == MODI_SHA1) 1640 hash_type = SH_SHA1; 1641 else if (type == MODI_MD5) 1642 hash_type = SH_MD5; 1643 else if (type == MODI_SHA256) 1644 hash_type = SH_SHA256; 1645 return; 1646 } 1647 1648 1611 1649 int sh_tiger_hashtype (const char * c) 1612 1650 { -
trunk/src/sh_tiger1_64.c
r474 r481 384 384 void tiger_compress(const word64 *str, word64 state[3]) 385 385 { 386 tiger_compress_macro((( word64*)str), ((word64*)state));386 tiger_compress_macro(((const word64*)str), ((word64*)state)); 387 387 } 388 388 … … 419 419 register word64 i; 420 420 register word64 j = 0; 421 unsigned char temp[64]; 421 union { 422 word64 w64_temp[8]; 423 unsigned char temp[64]; 424 } dd; 422 425 union { 423 426 word64 itmp; … … 435 438 #ifdef BIG_ENDIAN 436 439 for(j=0; j<64; j++) 437 temp[j^7] = ((sh_byte*)str)[j];438 tiger_compress(( (word64*)temp), res);440 dd.temp[j^7] = ((sh_byte*)str)[j]; 441 tiger_compress((dd.w64_temp), res); 439 442 #else 440 443 tiger_compress(str, res); … … 445 448 #ifdef BIG_ENDIAN 446 449 for(j=0; j<i; j++) 447 temp[j^7] = ((sh_byte*)str)[j];448 449 temp[j^7] = 0x01;450 dd.temp[j^7] = ((sh_byte*)str)[j]; 451 452 dd.temp[j^7] = 0x01; 450 453 j++; 451 454 for(; j&7; j++) 452 temp[j^7] = 0;455 dd.temp[j^7] = 0; 453 456 #else 454 457 455 458 #ifndef USE_MEMSET 456 459 for(j=0; j<i; j++) 457 temp[j] = ((sh_byte*)str)[j];458 #else 459 memcpy( temp, str, j=i );460 #endif 461 temp[j++] = 0x01;460 dd.temp[j] = ((const sh_byte*)str)[j]; 461 #else 462 memcpy( dd.temp, str, j=i ); 463 #endif 464 dd.temp[j++] = 0x01; 462 465 for(; j&7; j++) 463 temp[j] = 0;466 dd.temp[j] = 0; 464 467 465 468 #endif … … 469 472 #ifndef USE_MEMSET 470 473 for(; j<64; j++) 471 temp[j] = 0;472 #else 473 memset( temp+j, 0, 64-j);474 #endif 475 tiger_compress(( (word64*)temp), res);474 dd.temp[j] = 0; 475 #else 476 memset( (dd.temp)+j, 0, 64-j); 477 #endif 478 tiger_compress((dd.w64_temp), res); 476 479 j=0; 477 480 } … … 479 482 #ifndef USE_MEMSET 480 483 for(; j<56; j++) 481 temp[j] = 0;482 #else 483 memset( temp+j, 0, 56-j);484 dd.temp[j] = 0; 485 #else 486 memset( (dd.temp)+j, 0, 56-j); 484 487 #endif 485 488 … … 488 491 uu.itmp = ((word64)length)<<3; 489 492 for (j=0; j<8; j++) 490 temp[56+j] = uu.ctmp[j];491 492 tiger_compress(( (word64*)temp), res);493 dd.temp[56+j] = uu.ctmp[j]; 494 495 tiger_compress((dd.w64_temp), res); 493 496 } 494 497 -
trunk/src/sh_tools.c
r472 r481 109 109 p = (_("Key passed is not valid")); 110 110 else if (err_num == BAD_CIPHER_MODE) 111 p = (_("Params struct passed to cipherInit invalid"));111 p = (_("Params struct passed to rijndael_cipherInit invalid")); 112 112 else if (err_num == BAD_CIPHER_STATE) 113 113 p = (_("Cipher in wrong state")); … … 1371 1371 #if defined (SH_WITH_CLIENT) || defined (SH_WITH_SERVER) 1372 1372 1373 #if defined (SH_WITH_CLIENT) 1374 1375 static int probe_done = S_FALSE; 1376 static unsigned char probe_flag = '\0'; 1377 1378 void sh_tools_probe_reset() 1379 { 1380 probe_done = S_FALSE; 1381 probe_flag = '\0'; 1382 return; 1383 } 1384 1385 static int probe_ok(int flag) 1386 { 1387 (void) flag; 1388 if ((probe_flag & SH_PROTO_IVA) != 0) 1389 return S_TRUE; 1390 return S_FALSE; 1391 } 1392 1393 static unsigned char probe_header_set(unsigned char protocol) 1394 { 1395 if (probe_done || (protocol & SH_PROTO_SRP) == 0) 1396 return 0; 1397 1398 return (char) SH_PROTO_IVA; 1399 } 1400 1401 static void probe_header_get(unsigned char protocol) 1402 { 1403 if (probe_done || (protocol & SH_PROTO_SRP) == 0) 1404 return; 1405 1406 /* If the server doesn't know about it, 1407 * it will simply mirror it back. */ 1408 1409 if ((protocol & SH_PROTO_IVA) != 0) 1410 { 1411 /* probe was mirrored */; 1412 } 1413 else 1414 { 1415 /* probe was UNset */ 1416 probe_flag |= SH_PROTO_IVA; 1417 } 1418 probe_done = S_TRUE; 1419 return; 1420 } 1421 1422 #else 1423 static unsigned char probe_header_set(unsigned char protocol) { 1424 (void) protocol; return 0; } 1425 static void probe_header_get(unsigned char protocol) { 1426 (void) protocol; return; } 1427 void sh_tools_probe_reset() { return; } 1428 1429 unsigned char sh_tools_probe_store(unsigned char protocol, int * probe_flag) 1430 { 1431 if ((protocol & SH_PROTO_SRP) == 0) 1432 return protocol; 1433 1434 if ((protocol & SH_PROTO_IVA) != 0) 1435 { 1436 /* probe received */ 1437 *probe_flag |= SH_PROTO_IVA; 1438 protocol &= ~SH_PROTO_IVA; 1439 } 1440 return protocol; 1441 } 1442 1443 static int probe_ok(int flag) 1444 { 1445 if ((flag & SH_PROTO_IVA) != 0) 1446 return S_TRUE; 1447 return S_FALSE; 1448 } 1449 #endif 1450 1451 1373 1452 void get_header (unsigned char * head, unsigned long * bytes, char * u) 1374 1453 { 1375 1454 SL_ENTER(_("get_header")); 1455 1456 probe_header_get(head[0]); 1376 1457 1377 1458 *bytes = … … 1393 1474 #if defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER) 1394 1475 1395 #ifdef SH_ENCRYPT _21476 #ifdef SH_ENCRYPT 1396 1477 #define TRANS_BYTES 65120 1397 1478 #else … … 1399 1480 #endif 1400 1481 1401 void put_header (unsigned char * head, int protocol,1482 void put_header (unsigned char * head, const int protocol, 1402 1483 unsigned long * length, char * u) 1403 1484 { 1485 unsigned char probe = probe_header_set(protocol); 1404 1486 1405 1487 /* static long transfer_limit = (8 * SH_BUFSIZE); V0.8 */ … … 1408 1490 SL_ENTER(_("put_header")); 1409 1491 1410 head[0] = protocol ;1492 head[0] = protocol|probe; 1411 1493 1412 1494 ASSERT((*length < transfer_limit), _("*length < transfer_limit")) … … 1434 1516 SL_RET0(_("put_header")); 1435 1517 } 1436 #endif1437 1518 1438 1519 /* ------------------------------------------ … … 1453 1534 * only SH_V2_FULLSIZE is used, and only once 1454 1535 */ 1455 #if 0 1456 #ifdef SH_WITH_SERVER 1457 #define SH_V2_FULLSIZE 240 1458 #define SH_V2_PAYLOAD 224 1459 #define SH_V2_MESSAGE 176 1460 #else 1461 #define SH_V2_FULLSIZE 1024 1462 #define SH_V2_PAYLOAD 1008 1463 #define SH_V2_MESSAGE 960 1464 #endif 1465 #endif 1536 1466 1537 #define SH_V2_FULLSIZE 1024 1467 1538 … … 1508 1579 1509 1580 #ifdef SH_ENCRYPT 1581 1510 1582 /* 1511 1583 * #define DEBUG_EN2 … … 1514 1586 * last 4 bytes of outgoing header are set to dummy value 1515 1587 */ 1516 char * sh_tools_makePack (unsigned char * header, 1588 char * sh_tools_makePack (unsigned char * header, int flag, 1517 1589 char * payload, unsigned long payload_size, 1518 1590 keyInstance * keyInstE) 1519 1591 { 1520 UINT32 rpad[3]; 1592 BYTE inBlock[B_SIZ]; 1593 BYTE outBlock[B_SIZ]; 1594 char ivBlock[B_SIZ]; 1595 1596 UINT32 rpad[3]; 1521 1597 unsigned char head[16]; 1522 double epad; 1523 unsigned long i_epad = 0; 1524 unsigned long i_blk = payload_size / 16; 1525 unsigned long i_blkmax = SH_V2_FULLSIZE / 16; 1526 unsigned long pads = 0; 1527 size_t full_size; 1528 char * full_ret; 1529 1530 char * p; 1531 RIJ_BYTE inBlock[B_SIZ]; 1532 RIJ_BYTE outBlock[B_SIZ]; 1533 int j; 1534 cipherInstance cipherInst; 1535 int err_num; 1536 int blkfac; 1537 int oflow = 0; 1598 double epad; 1599 unsigned long i_epad = 0; 1600 unsigned long i_blk = payload_size / 16; 1601 unsigned long i_blkmax = SH_V2_FULLSIZE / 16; 1602 unsigned long pads = 0; 1603 size_t full_size; 1604 char * full_ret; 1605 1606 unsigned char * p; 1607 int j; 1608 cipherInstance cipherInst; 1609 int err_num; 1610 int blkfac; 1611 int oflow = 0; 1612 char expbuf[SH_ERRBUF_SIZE]; 1538 1613 1539 1614 /* … … 1541 1616 */ 1542 1617 if ((i_blk * 16) != payload_size) ++i_blk; 1543 #ifdef DEBUG_EN2 1544 fprintf(stderr, "SEND <%d> blocks <%d>\n", payload_size, i_blk); 1545 #endif 1618 1546 1619 /* random_pad 1547 1620 */ … … 1553 1626 memcpy (&head[8], &rpad[2], 4); 1554 1627 1555 /* protocol1556 */1557 /* memcpy (&head[8], &header[3], 4); */1558 1559 1628 /* size (payload) 1560 1629 */ … … 1566 1635 if (i_blk < i_blkmax) 1567 1636 { 1568 pads = i_blkmax - i_blk; 1569 /* memcpy((char *) &rpad[2], &head[12], 4); */ 1570 epad = taus_get_double (&rpad); 1571 #ifdef DEBUG_EN2 1572 fprintf(stderr, "PAD1 <%d> <%f>\n", pads, epad); 1573 #endif 1637 pads = i_blkmax - i_blk; 1638 epad = taus_get_double (&rpad); 1574 1639 i_epad = (unsigned long) (pads * epad); 1575 #ifdef DEBUG_EN21576 fprintf(stderr, "PAD2 <%d> <%d>\n", i_epad, (i_epad*16));1577 #endif1578 1640 } 1579 1641 … … 1596 1658 1597 1659 full_ret = SH_ALLOC(full_size); 1660 1598 1661 memcpy(full_ret, head, 16); 1599 1662 if (payload != NULL && !oflow) 1600 { 1601 memcpy(&full_ret[16], payload, payload_size); 1602 } 1663 memcpy(&full_ret[16], payload, payload_size); 1664 1603 1665 if ((i_blk*16) > payload_size && !oflow) 1604 1666 { 1605 #ifdef DEBUG_EN21606 fprintf(stderr, "SEN2 <%d>\n", (i_blk*16) - payload_size);1607 #endif1608 1667 memset(&full_ret[16+payload_size], '\0', (i_blk*16) - payload_size); 1609 1668 payload_size = i_blk * 16; 1610 1669 } 1611 1670 memset(&full_ret[16+payload_size], '\0', i_epad*16); 1612 #ifdef DEBUG_EN21613 fprintf(stderr, "SEN3 <%d> <%d>\n", full_size, i_epad*16);1614 #endif1615 1671 1616 1672 /* rewrite header … … 1618 1674 header[1] = (unsigned int)(full_size/256); 1619 1675 header[2] = (unsigned int)(full_size - (256 * header[1])); 1620 /* don't erase protocol from header 1621 memset(&header[3], '\0', 4); 1622 */ 1623 p = full_ret; blkfac = full_size / 16; 1624 1625 err_num = cipherInit (&cipherInst, MODE_CBC, NULL); 1676 1677 p = (unsigned char *) full_ret; 1678 blkfac = full_size / B_SIZ; 1679 1680 err_num = rijndael_cipherInit (&cipherInst, MODE_CBC, NULL); 1626 1681 1627 if (err_num < 0) 1628 { 1629 char expbuf[SH_ERRBUF_SIZE]; 1630 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN, 1631 errorExplain(err_num, expbuf, sizeof(expbuf)), 1632 _("sh_tools_makePack: cipherInit")); 1633 } 1634 for (j = 0; j < blkfac; ++j) 1635 { 1682 if (err_num < 0) { 1683 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN, 1684 errorExplain(err_num, expbuf, sizeof(expbuf)), 1685 _("sh_tools_makePack: rijndael_cipherInit")); } 1686 1687 if (probe_ok(flag)) { 1688 memcpy(inBlock, p, B_SIZ); 1689 err_num = rijndael_blockEncrypt(&cipherInst, keyInstE, 1690 inBlock, 128, outBlock); 1691 if (err_num >= 0) { 1692 memcpy(p, outBlock, B_SIZ); p += B_SIZ; 1693 memcpy(ivBlock, outBlock, sizeof(ivBlock)); 1694 err_num = rijndael_cipherInit (&cipherInst, MODE_CBC, ivBlock); 1695 if (err_num >= 0) { 1696 err_num = rijndael_blockEncrypt(&cipherInst, keyInstE, 1697 p, 128*(blkfac-1), p); 1698 } 1699 } 1700 } 1701 1702 else { 1703 for (j = 0; j < blkfac; ++j) { 1636 1704 memcpy(inBlock, p, B_SIZ); 1637 err_num = blockEncrypt(&cipherInst, keyInstE,1638 inBlock, 128 * BNUM, outBlock);1639 if (err_num < 0)1640 1641 char expbuf[SH_ERRBUF_SIZE];1642 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN,1643 errorExplain(err_num, expbuf, sizeof(expbuf)),1644 _("sh_tools_makePack: blockEncrypt"));1645 } 1705 err_num = rijndael_blockEncrypt(&cipherInst, keyInstE, 1706 inBlock, 128, outBlock); 1707 1708 if (err_num < 0) { 1709 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN, 1710 errorExplain(err_num, expbuf, sizeof(expbuf)), 1711 _("sh_tools_makePack: rijndael_blockEncrypt")); 1712 break; } 1713 1646 1714 memcpy(p, outBlock, B_SIZ); 1647 1715 p += B_SIZ; 1648 1716 } 1717 } 1649 1718 1650 1719 return full_ret; … … 1654 1723 * last 4 bytes of incoming header are dummy 1655 1724 */ 1656 char * sh_tools_revertPack (unsigned char * header, char * message,1725 char * sh_tools_revertPack (unsigned char * header, int flag, char * message, 1657 1726 keyInstance * keyInstD, 1658 1727 unsigned long message_size) 1659 1728 { 1729 BYTE inBlock[B_SIZ]; 1730 BYTE outBlock[B_SIZ]; 1731 char ivBlock[B_SIZ]; 1660 1732 unsigned long msg_size; 1661 1733 char * msg_ret; 1662 1734 1663 char * p; 1664 RIJ_BYTE inBlock[B_SIZ]; 1665 RIJ_BYTE outBlock[B_SIZ]; 1735 unsigned char * p; 1666 1736 int j; 1667 1737 cipherInstance cipherInst; … … 1671 1741 1672 1742 msg_size = (256 * (unsigned int)header[1] + (unsigned int)header[2]); 1673 #ifdef DEBUG_EN2 1674 fprintf(stderr, "RECV <%lu>\n", msg_size); 1675 #endif 1676 if (msg_size > message_size) { 1743 if (msg_size > message_size) 1677 1744 msg_size = message_size; 1678 #ifdef DEBUG_EN2 1679 fprintf(stderr, "RECV TRUNC1 <%lu>\n", msg_size); 1680 #endif 1681 } 1682 1683 p = message; blkfac = msg_size / 16; 1684 1685 err_num = cipherInit (&cipherInst, MODE_CBC, NULL); 1745 1746 p = (unsigned char *) message; blkfac = msg_size / 16; 1747 1748 err_num = rijndael_cipherInit (&cipherInst, MODE_CBC, NULL); 1686 1749 1687 1750 if (err_num < 0) … … 1689 1752 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN, 1690 1753 errorExplain(err_num, expbuf, sizeof(expbuf)), 1691 _("sh_tools_revertPack: cipherInit")); 1692 } 1693 for (j = 0; j < blkfac; ++j) 1694 { 1754 _("sh_tools_revertPack: rijndael_cipherInit")); 1755 } 1756 1757 if (probe_ok(flag)) { 1758 memcpy(inBlock, p, B_SIZ); 1759 err_num = rijndael_blockDecrypt(&cipherInst, keyInstD, 1760 inBlock, 128, outBlock); 1761 if (err_num >= 0) { 1762 memcpy(p, outBlock, B_SIZ); p += B_SIZ; 1763 memcpy(ivBlock, inBlock, sizeof(ivBlock)); 1764 err_num = rijndael_cipherInit (&cipherInst, MODE_CBC, ivBlock); 1765 if (err_num >= 0) { 1766 err_num = rijndael_blockDecrypt(&cipherInst, keyInstD, 1767 p, 128*(blkfac-1), p); 1768 } 1769 } 1770 } 1771 1772 else { 1773 for (j = 0; j < blkfac; ++j) { 1695 1774 memcpy(inBlock, p, B_SIZ); 1696 err_num = blockDecrypt(&cipherInst, keyInstD, 1697 inBlock, 128 * BNUM, outBlock); 1698 if (err_num < 0) 1699 { 1700 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN, 1701 errorExplain(err_num, expbuf, sizeof(expbuf)), 1702 _("sh_tools_revertPack: blockDecrypt")); 1703 } 1775 err_num = rijndael_blockDecrypt(&cipherInst, keyInstD, 1776 inBlock, 128, outBlock); 1777 1778 if (err_num < 0) { 1779 sh_error_handle((-1), FIL__, __LINE__, -1, MSG_E_SUBGEN, 1780 errorExplain(err_num, expbuf, sizeof(expbuf)), 1781 _("sh_tools_revertPack: rijndael_blockDecrypt")); 1782 break; } 1783 1704 1784 memcpy(p, outBlock, B_SIZ); 1705 1785 p += B_SIZ; 1706 1786 } 1707 1787 } 1788 1708 1789 /* rewrite size in header 1709 1790 */ … … 1717 1798 header[1] = (unsigned int)(msg_size/256); 1718 1799 header[2] = (unsigned int)(msg_size - (256 * header[1])); 1719 #ifdef DEBUG_EN2 1720 fprintf(stderr, "RECV TRUNC2 <%lu>\n", msg_size); 1721 #endif 1722 } 1723 #ifdef DEBUG_EN2 1724 fprintf(stderr, "REC2 <%lu>\n", msg_size); 1725 #endif 1726 /* protocol 1727 */ 1728 /* memcpy(&header[3], &message[8], 4); */ 1800 } 1729 1801 1730 1802 /* payload … … 1732 1804 msg_ret = SH_ALLOC(msg_size+1); 1733 1805 if (msg_size > 0) 1734 { 1735 memcpy(msg_ret, &message[16], msg_size); 1736 } 1806 memcpy(msg_ret, &message[16], msg_size); 1737 1807 msg_ret[msg_size] = '\0'; 1738 #ifdef DEBUG_EN2 1739 fprintf(stderr, "REC3 <%lu>\n", msg_size); 1740 #endif 1808 1741 1809 SH_FREE(message); 1742 1743 1810 return msg_ret; 1744 1811 } 1745 #endif 1812 #endif /* #ifdef SH_ENCRYPT */ 1746 1813 1747 1814 int sh_tools_hash_add(char * key, char * buf, int buflen) … … 1781 1848 SL_RETURN((1), _("sh_tools_hash_vfy")); 1782 1849 } 1850 1851 #endif /* defined(SH_WITH_CLIENT) || defined(SH_WITH_SERVER) */ 1852 1783 1853 1784 1854 /* ------------------------------------------ */ … … 1868 1938 #if defined (SH_WITH_SERVER) 1869 1939 1870 char * get_client_conf_file (c har * peer, unsigned long * length)1940 char * get_client_conf_file (const char * peer, unsigned long * length) 1871 1941 { 1872 1942 char * ret; … … 1874 1944 struct stat buf; 1875 1945 char * base; 1876 size_t size;1877 1946 1878 1947 SL_ENTER(_("get_client_conf_file")); 1879 1948 1880 1949 base = sh_util_strdup(DEFAULT_DATAROOT); 1881 1882 size = sl_strlen(base); 1883 if (sl_ok_adds(size, sl_strlen(peer))) 1884 size += sl_strlen(peer); 1885 if (sl_ok_adds(size, 6)) 1886 size += 6; 1887 1888 ret = SH_ALLOC(size); 1889 sl_strlcpy(ret, base, size); 1890 sl_strlcat(ret, _("/rc."), size); 1891 sl_strlcat(ret, peer, size); 1892 1950 ret = sh_util_strconcat(base, _("/rc."), peer, NULL); 1951 if (!ret) 1952 { SH_FREE(base); *length = 0; SL_RETURN(NULL, _("get_client_conf_file")); } 1953 1893 1954 status = retry_stat (FIL__, __LINE__, ret, &buf); 1894 1895 1955 if (status == 0) 1896 1956 goto lab_end; … … 1899 1959 (long) sh.effective.uid, ret); 1900 1960 1901 sl_strlcpy(ret, base, size); 1902 sl_strlcat(ret, "/rc", size); 1961 SH_FREE(ret); ret = sh_util_strconcat(base, _("/rc"), NULL); 1962 if (!ret) 1963 { SH_FREE(base); *length = 0; SL_RETURN(NULL, _("get_client_conf_file")); } 1903 1964 1904 1965 status = retry_stat (FIL__, __LINE__, ret, &buf); 1905 1906 1966 if (status == 0) 1907 1967 goto lab_end; … … 1910 1970 (long) sh.effective.uid, ret); 1911 1971 1912 SH_FREE(base); 1913 SH_FREE(ret); 1914 *length=0; 1972 SH_FREE(base); SH_FREE(ret); *length=0; 1915 1973 SL_RETURN(NULL, _("get_client_conf_file")); 1916 1974 … … 1920 1978 sh_error_handle(SH_ERR_ERR, FIL__, __LINE__, status, MSG_E_SUBGEN, 1921 1979 _("File too large"), _("get_client_conf_file")); 1922 SH_FREE(base); 1980 SH_FREE(base); SH_FREE(ret); *length = 0; 1923 1981 SL_RETURN(NULL, _("get_client_conf_file")); 1924 1982 } 1925 *length = (unsigned long) buf.st_size; 1926 SH_FREE(base); 1983 1984 SH_FREE(base); *length = (unsigned long) buf.st_size; 1927 1985 SL_RETURN(ret, _("get_client_conf_file")); 1928 1986 } 1929 1987 1930 char * get_client_data_file (c har * peer, unsigned long * length)1988 char * get_client_data_file (const char * peer, unsigned long * length) 1931 1989 { 1932 1990 char * ret; 1933 1991 int status; 1934 1992 struct stat buf; 1935 1936 1993 char * base; 1937 size_t size;1938 1994 1939 1995 SL_ENTER(_("get_client_data_file")); 1940 1996 1941 1997 base = sh_util_strdup(DEFAULT_DATAROOT); 1942 1943 size = sl_strlen(base); 1944 if (sl_ok_adds(size, sl_strlen(peer))) 1945 size += sl_strlen(peer); 1946 if (sl_ok_adds(size, 8)) 1947 size += 8; 1948 1949 ret = SH_ALLOC(size); 1950 sl_strlcpy(ret, base, size); 1951 sl_strlcat(ret, _("/file."), size); 1952 sl_strlcat(ret, peer, size); 1953 1998 ret = sh_util_strconcat(base, _("/file."), peer, NULL); 1999 if (!ret) 2000 { SH_FREE(base); *length = 0; SL_RETURN(NULL, _("get_client_data_file")); } 2001 1954 2002 status = retry_stat (FIL__, __LINE__, ret, &buf); 1955 1956 2003 if (status == 0) 1957 2004 goto lab1_end; … … 1960 2007 (long) sh.effective.uid, ret); 1961 2008 1962 1963 sl_strlcpy(ret, base, size); 1964 sl_strlcat(ret, _("/file"), size); 1965 2009 SH_FREE(ret); 2010 ret = sh_util_strconcat(base, _("/file"), NULL); 2011 if (!ret) 2012 { SH_FREE(base); *length = 0; SL_RETURN(NULL, _("get_client_data_file")); } 2013 1966 2014 status = retry_stat (FIL__, __LINE__, ret, &buf); 1967 1968 2015 if (status == 0) 1969 2016 goto lab1_end; … … 1972 2019 (long) sh.effective.uid, ret); 1973 2020 1974 1975 *length = 0; 1976 SH_FREE(base); 1977 SH_FREE(ret); 2021 *length = 0; SH_FREE(base); SH_FREE(ret); 1978 2022 SL_RETURN(NULL, _("get_client_data_file")); 1979 2023 … … 1983 2027 sh_error_handle(SH_ERR_ERR, FIL__, __LINE__, status, MSG_E_SUBGEN, 1984 2028 _("File too large"), _("get_client_data_file")); 1985 SH_FREE(base); 2029 SH_FREE(base); SH_FREE(ret); *length = 0; 1986 2030 SL_RETURN(NULL, _("get_client_data_file")); 1987 2031 } 2032 2033 *length = (unsigned long) buf.st_size; SH_FREE(base); 2034 SL_RETURN(ret, _("get_client_data_file")); 2035 } 2036 2037 char * get_client_uuid_file (const char * peer, unsigned long * length, const char * uuid) 2038 { 2039 char * ret; 2040 int status; 2041 struct stat buf; 2042 char * base; 2043 2044 SL_ENTER(_("get_client_uuid_file")); 2045 2046 base = sh_util_strdup(DEFAULT_DATAROOT); 2047 ret = sh_util_strconcat(base, _("/file."), peer, ".", uuid, NULL); 2048 SH_FREE(base); 2049 if (!ret) 2050 { *length = 0; SL_RETURN(NULL, _("get_client_uuid_file")); } 2051 2052 status = retry_stat (FIL__, __LINE__, ret, &buf); 2053 if (status != 0) 2054 { 2055 sh_error_handle(SH_ERR_ERR, FIL__, __LINE__, status, MSG_E_ACCESS, 2056 (long) sh.effective.uid, ret); 2057 SH_FREE(ret); *length = 0; 2058 SL_RETURN(NULL, _("get_client_uuid_file")); 2059 } 2060 else if (buf.st_size > 0x7fffffff) 2061 { 2062 sh_error_handle(SH_ERR_ERR, FIL__, __LINE__, status, MSG_E_SUBGEN, 2063 _("File too large"), _("get_client_uuid_file")); 2064 SH_FREE(ret); *length = 0; 2065 SL_RETURN(NULL, _("get_client_data_file")); 2066 } 2067 1988 2068 *length = (unsigned long) buf.st_size; 1989 SH_FREE(base); 1990 SL_RETURN(ret, _("get_client_data_file")); 1991 1992 } 2069 SL_RETURN(ret, _("get_client_uuid_file")); 2070 } 2071 1993 2072 #endif 1994 2073 … … 2091 2170 if (SL_ISERROR(fd)) 2092 2171 { 2093 sh_error_handle( SH_ERR_ALL, FIL__, __LINE__, fd, MSG_E_SUBGEN,2172 sh_error_handle((-1), FIL__, __LINE__, fd, MSG_E_SUBGEN, 2094 2173 _("Error opening temporary file"), _("open_tmp")); 2095 2174 TPT(( 0, FIL__, __LINE__, _("msg=<Error %d temporary file %s>\n"), 2096 2175 fd, file)); 2097 2176 } 2098 2099 2177 2100 2178 SH_FREE (file); -
trunk/src/sh_unix.c
r474 r481 103 103 #include "sh_prelink.h" 104 104 #include "sh_pthread.h" 105 #include "sh_sem.h" 105 106 106 107 /* moved here from far below … … 482 483 sl_strlcat(msg, details, 128); 483 484 (void) safe_logger (thesignal, method, msg); 485 486 close_ipc (); 484 487 raise(SIGKILL); 485 488 } … … 526 529 } while (val_return < 0 && errno == EINTR); 527 530 531 close_ipc (); 528 532 safe_logger (mysignal, 0, NULL); 529 533 } … … 594 598 if (skey != NULL) 595 599 memset (skey, '\0', sizeof(sh_key_t)); 596 #ifdef WITH_MESSAGE_QUEUE597 600 close_ipc (); 598 #endif599 601 safe_logger (mysignal, 0, NULL); 600 602 do { … … 636 638 if (skey != NULL) 637 639 memset (skey, '\0', sizeof(sh_key_t)); 638 #ifdef WITH_MESSAGE_QUEUE639 640 close_ipc (); 640 #endif641 641 642 642 do { … … 669 669 #endif 670 670 #ifdef SIGTTOU 671 if (mysignal == SIGTTOU) 672 sig_force_check = 1; 671 if (mysignal == SIGTTOU) { 672 sig_force_check = 1; sh_sem_trylock(); } 673 673 #endif 674 674 #ifdef SIGTTIN … … 682 682 #ifdef SIGQUIT 683 683 if (mysignal == SIGQUIT) 684 { 685 sig_terminate = 1; 686 ++sig_urgent; 687 } 684 sig_terminate = 1; 688 685 #endif 689 686 #ifdef SIGTERM … … 1042 1039 if ((status == ERANGE) && (w == NULL)) 1043 1040 { 1044 if (S L_TRUE == sl_ok_adds( gbufsize, SH_GRBUF_SIZE ))1041 if (S_TRUE == sl_ok_adds( gbufsize, SH_GRBUF_SIZE )) 1045 1042 { 1046 1043 SH_FREE(buffer); … … 1722 1719 struct utsname buf; 1723 1720 int i; 1724 intddot;1721 unsigned int ddot; 1725 1722 int len; 1726 1723 char * p; … … 1892 1889 */ 1893 1890 #if defined(HAVE_MLOCK) && !defined(HAVE_BROKEN_MLOCK) 1894 if (skey->mlock_failed == S L_FALSE)1891 if (skey->mlock_failed == S_FALSE) 1895 1892 { 1896 1893 if ( (-1) == sh_unix_mlock( FIL__, __LINE__, … … 1898 1895 { 1899 1896 SH_MUTEX_LOCK_UNSAFE(mutex_skey); 1900 skey->mlock_failed = S L_TRUE;1897 skey->mlock_failed = S_TRUE; 1901 1898 SH_MUTEX_UNLOCK_UNSAFE(mutex_skey); 1902 1899 } 1903 1900 } 1904 1901 #else 1905 if (skey->mlock_failed == S L_FALSE)1902 if (skey->mlock_failed == S_FALSE) 1906 1903 { 1907 1904 SH_MUTEX_LOCK_UNSAFE(mutex_skey); 1908 skey->mlock_failed = S L_TRUE;1905 skey->mlock_failed = S_TRUE; 1909 1906 SH_MUTEX_UNLOCK_UNSAFE(mutex_skey); 1910 1907 } … … 1980 1977 1981 1978 if (dummy == NULL) 1982 sh.flag.isdaemon = ON;1979 sh.flag.isdaemon = S_TRUE; 1983 1980 else 1984 1981 res = sh_util_flagval (dummy, &sh.flag.isdaemon); … … 2003 2000 2004 2001 if (dummy == NULL) 2005 sh.flag.isdaemon = OFF;2002 sh.flag.isdaemon = S_FALSE; 2006 2003 else 2007 2004 res = sh_util_flagval (dummy, &sh.flag.isdaemon); … … 2221 2218 char * tz = sh_util_strdup(getenv("TZ")); /* flawfinder: ignore */ 2222 2219 size_t tzlen = strlen(tz); 2223 if (S L_TRUE == sl_ok_adds (4, tzlen)) {2220 if (S_TRUE == sl_ok_adds (4, tzlen)) { 2224 2221 env[3] = SH_ALLOC(4+tzlen); 2225 2222 sl_strlcpy(env[3], "TZ=", 4); … … 2244 2241 memset(skey, 0, sizeof(sh_key_t)); 2245 2242 (void) umask(S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH); 2246 sh_unix_closeall (3, -1, S L_TRUE); /* in child process */2243 sh_unix_closeall (3, -1, S_TRUE); /* in child process */ 2247 2244 execve(path, arg, env); 2248 2245 _exit(EXIT_FAILURE); … … 2284 2281 struct tm bb; 2285 2282 2283 struct tm * aptr; 2284 struct tm * bptr; 2285 2286 2286 int sign = 0; 2287 2287 int diff = 0; … … 2292 2292 2293 2293 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GMTIME_R) 2294 gmtime_r (xx, &aa);2294 aptr = gmtime_r (xx, &aa); 2295 2295 #else 2296 memcpy (&aa, gmtime(xx), sizeof(struct tm)); 2296 aptr = gmtime(xx); 2297 if (aptr) 2298 memcpy (&aa, aptr, sizeof(struct tm)); 2297 2299 #endif 2298 2300 2299 2301 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_LOCALTIME_R) 2300 localtime_r (xx, &bb);2302 bptr = localtime_r (xx, &bb); 2301 2303 #else 2302 memcpy (&bb, localtime(xx), sizeof(struct tm)); 2303 #endif 2304 2305 /* Check for datum wrap-around. 2306 */ 2307 if (aa.tm_year < bb.tm_year) 2308 sign = (-1); 2309 else if (aa.tm_mon < bb.tm_mon) 2310 sign = (-1); 2311 else if (aa.tm_mday < bb.tm_mday) 2312 sign = (-1); 2313 else if (bb.tm_year < aa.tm_year) 2314 sign = ( 1); 2315 else if (bb.tm_mon < aa.tm_mon) 2316 sign = ( 1); 2317 else if (bb.tm_mday < aa.tm_mday) 2318 sign = ( 1); 2319 2320 diff = aa.tm_hour * 60 + aa.tm_min; 2321 diff = (bb.tm_hour * 60 + bb.tm_min) - diff; 2322 diff = diff - (sign * 24 * 60); /* datum wrap-around correction */ 2323 hh = diff / 60; 2324 mm = diff - (hh * 60); 2325 sprintf (tz, _("%+03d%02d"), hh, mm); /* known to fit */ 2326 2304 bptr = localtime(xx); 2305 if (bptr) 2306 memcpy (&bb, bptr, sizeof(struct tm)); 2307 #endif 2308 2309 if (bptr && aptr) 2310 { 2311 /* Check for datum wrap-around. 2312 */ 2313 if (aa.tm_year < bb.tm_year) 2314 sign = (-1); 2315 else if (aa.tm_mon < bb.tm_mon) 2316 sign = (-1); 2317 else if (aa.tm_mday < bb.tm_mday) 2318 sign = (-1); 2319 else if (bb.tm_year < aa.tm_year) 2320 sign = ( 1); 2321 else if (bb.tm_mon < aa.tm_mon) 2322 sign = ( 1); 2323 else if (bb.tm_mday < aa.tm_mday) 2324 sign = ( 1); 2325 2326 diff = aa.tm_hour * 60 + aa.tm_min; 2327 diff = (bb.tm_hour * 60 + bb.tm_min) - diff; 2328 diff = diff - (sign * 24 * 60); /* datum wrap-around correction */ 2329 hh = diff / 60; 2330 mm = diff - (hh * 60); 2331 sprintf (tz, _("%+03d%02d"), hh, mm); /* known to fit */ 2332 } 2333 else 2334 { 2335 sprintf (tz, _("%+03d%02d"), 0, 0); 2336 } 2327 2337 SL_RETURN(tz, _("t_zone")); 2328 2338 } … … 2560 2570 static int sh_unix_use_localtime = S_FALSE; 2561 2571 2562 /* whether to use localtime for file times atams in logs2572 /* whether to use localtime for file timestamps in logs 2563 2573 */ 2564 2574 int sh_unix_uselocaltime (const char * c) … … 3485 3495 3486 3496 int sh_unix_checksum_size (char * filename, off_t size, int is_max_size, 3487 char * fileHash, int alert_timeout, SL_TICKET fd )3497 char * fileHash, int alert_timeout, SL_TICKET fd, unsigned long mask) 3488 3498 { 3489 3499 file_type * tmpFile; … … 3517 3527 char hashbuf[KEYBUF_SIZE]; 3518 3528 UINT64 local_length = (UINT64) (tmpFile->size < 0 ? 0 : tmpFile->size); 3529 if (sh.flag.opts == S_TRUE) sh_tiger_set_hashtype_mask(mask); 3519 3530 sl_strlcpy(fileHash, 3520 3531 sh_tiger_generic_hash (filename, fd, &(local_length), … … 3541 3552 3542 3553 int sh_check_rotated_log (const char * path, 3543 UINT64 old_size, UINT64 old_inode, const char * old_hash )3554 UINT64 old_size, UINT64 old_inode, const char * old_hash, unsigned long mask) 3544 3555 { 3545 3556 struct stat obuf; … … 3560 3571 if (!SL_ISERROR(fd)) 3561 3572 { 3562 sh_unix_checksum_size (rotated_file, old_size, S_FALSE, hashbuf, 120 /* alert_timeout */, fd); 3573 sh_unix_checksum_size (rotated_file, old_size, S_FALSE, 3574 hashbuf, 120 /* alert_timeout */, fd, mask); 3563 3575 3564 3576 sl_close(fd); … … 3814 3826 SL_ENTER(_("sh_unix_getinfo")); 3815 3827 3816 if (!MODI_INITIALIZED(theFile->check_ mask))3828 if (!MODI_INITIALIZED(theFile->check_flags)) 3817 3829 { 3818 3830 tmp2 = sh_util_safe_name (theFile->fullpath); … … 3823 3835 SH_MUTEX_UNLOCK(mutex_thread_nolog); 3824 3836 SH_FREE(tmp2); 3837 SL_RETURN((-1),_("sh_unix_getinfo")); 3825 3838 } 3826 3839 … … 3989 4002 if (fileHash != NULL) 3990 4003 { 3991 if ((theFile->check_ mask& MODI_CHK) == 0 ||4004 if ((theFile->check_flags & MODI_CHK) == 0 || 3992 4005 sh_restrict_this(theFile->fullpath, (UINT64) fbuf.st_size, 3993 4006 (UINT64) fbuf.st_mode, rval_open)) … … 3995 4008 sl_strlcpy(fileHash, SH_KEY_NULL, KEY_LEN+1); 3996 4009 } 3997 else if ((theFile->check_ mask& MODI_PREL) != 0 &&4010 else if ((theFile->check_flags & MODI_PREL) != 0 && 3998 4011 S_TRUE == sh_prelink_iself(rval_open, fbuf.st_size, 3999 4012 alert_timeout, theFile->fullpath)) 4000 4013 { 4001 4014 if (0 != sh_prelink_run (theFile->fullpath, 4002 fileHash, alert_timeout ))4015 fileHash, alert_timeout, theFile->check_flags)) 4003 4016 sl_strlcpy(fileHash, SH_KEY_NULL, KEY_LEN+1); 4004 4017 } … … 4008 4021 UINT64 length_current = TIGER_NOLIM; 4009 4022 4010 if (MODI_TXT_ENABLED(theFile->check_ mask) && fbuf.st_size < (10 * SH_TXT_MAX))4023 if (MODI_TXT_ENABLED(theFile->check_flags) && fbuf.st_size < (10 * SH_TXT_MAX)) 4011 4024 { 4012 4025 sl_init_content (rval_open, fbuf.st_size); 4013 4026 } 4014 4027 4028 if (sh.flag.opts == S_TRUE) sh_tiger_set_hashtype_mask(theFile->check_flags); 4015 4029 sl_strlcpy(fileHash, 4016 4030 sh_tiger_generic_hash (theFile->fullpath, … … 4023 4037 content = sh_string_copy(content); 4024 4038 4025 if ((theFile->check_ mask& MODI_SGROW) != 0)4039 if ((theFile->check_flags & MODI_SGROW) != 0) 4026 4040 { 4027 4041 /* Update size so it matches the one for which the checksum … … 4032 4046 sh_unix_checksum_size (theFile->fullpath, length_current, S_TRUE, 4033 4047 &fileHash[KEY_LEN + 1], 4034 alert_timeout, rval_open );4048 alert_timeout, rval_open, theFile->check_flags); 4035 4049 } 4036 4050 } … … 4046 4060 if (fileHash != NULL) 4047 4061 { 4048 if ((theFile->check_ mask& MODI_CHK) == 0 ||4062 if ((theFile->check_flags & MODI_CHK) == 0 || 4049 4063 sh_restrict_this(theFile->fullpath, (UINT64) fbuf.st_size, 4050 4064 (UINT64) fbuf.st_mode, rval_open)) … … 4057 4071 { 4058 4072 if (0 != sh_prelink_run (theFile->fullpath, 4059 fileHash, alert_timeout ))4073 fileHash, alert_timeout, theFile->check_flags)) 4060 4074 sl_strlcpy(fileHash, SH_KEY_NULL, KEY_LEN+1); 4061 4075 } … … 4065 4079 UINT64 length_current = TIGER_NOLIM; 4066 4080 4067 if (MODI_TXT_ENABLED(theFile->check_ mask) && fbuf.st_size < (10 * SH_TXT_MAX))4081 if (MODI_TXT_ENABLED(theFile->check_flags) && fbuf.st_size < (10 * SH_TXT_MAX)) 4068 4082 { 4069 4083 sl_init_content (rval_open, fbuf.st_size); 4070 4084 } 4071 4085 4086 if (sh.flag.opts == S_TRUE) sh_tiger_set_hashtype_mask(theFile->check_flags); 4072 4087 sl_strlcpy(fileHash, 4073 4088 sh_tiger_generic_hash (theFile->fullpath, rval_open, … … 4080 4095 content = sh_string_copy(content); 4081 4096 4082 if ((theFile->check_ mask& MODI_SGROW) != 0)4097 if ((theFile->check_flags & MODI_SGROW) != 0) 4083 4098 { 4084 4099 /* Update size so it matches the one for which the checksum … … 4089 4104 sh_unix_checksum_size (theFile->fullpath, length_current, S_TRUE, 4090 4105 &fileHash[KEY_LEN + 1], 4091 alert_timeout, rval_open );4106 alert_timeout, rval_open, theFile->check_flags); 4092 4107 } 4093 4108 } … … 4105 4120 sl_strlcpy(fileHash, SH_KEY_NULL, KEY_LEN+1); 4106 4121 4107 if ((theFile->check_ mask& MODI_CHK) != 0)4122 if ((theFile->check_flags & MODI_CHK) != 0) 4108 4123 { 4109 4124 tmp2 = sh_util_safe_name (theFile->fullpath); … … 4276 4291 /* --- Output the file. --- 4277 4292 */ 4278 if (flag_err_debug == S L_TRUE)4293 if (flag_err_debug == S_TRUE) 4279 4294 { 4280 4295 tmp2 = sh_util_safe_name ((filename == NULL) ? … … 5294 5309 int sh_unix_count_mlock() 5295 5310 { 5296 int i = 0;5311 unsigned int i = 0; 5297 5312 char str[32][64]; 5298 5313 sh_page_l * page_list; … … 5325 5340 #ifdef WITH_TPT 5326 5341 { 5327 int j = 0;5342 unsigned int j = 0; 5328 5343 while (j < i && j < 32) 5329 5344 { 5330 sh_error_handle(SH_ERR_ INFO, FIL__, __LINE__, j, MSG_E_SUBGEN,5345 sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, j, MSG_E_SUBGEN, 5331 5346 str[j], _("sh_unix_count_mlock")); 5332 5347 ++j; … … 5336 5351 5337 5352 sl_snprintf(str[0], 64, _("%d pages locked"), i); 5338 sh_error_handle(SH_ERR_ INFO, FIL__, __LINE__, i, MSG_E_SUBGEN,5353 sh_error_handle(SH_ERR_ALL, FIL__, __LINE__, i, MSG_E_SUBGEN, 5339 5354 str[0], _("sh_unix_count_mlock")); 5340 5355 SL_RETURN((i), _("sh_unix_count_mlock")); … … 5515 5530 this_line = 0; 5516 5531 c = '\0'; 5517 while (c != '\n' && num > 0 &&this_line < (sizeof(theline)-1))5532 while (c != '\n' && this_line < (sizeof(theline)-1)) 5518 5533 { 5519 5534 do { -
trunk/src/sh_utils.c
r473 r481 309 309 } 310 310 } 311 out[rem] = ','; ++rem; 312 while (p[1] == '\n') ++p; /* scan over consecutive newlines */311 out[rem] = ','; ++rem; /* <-- ensures (rem > 0) is true */ 312 while (p[1] == '\n') ++p; /* scan over consecutive newlines */ 313 313 state = 0; 314 314 if (p[1] == '\0') { 315 if (rem > 0) out[rem-1] = '\0';315 out[rem-1] = '\0'; /* rem > 0 because of 4 lines above */ 316 316 break; 317 317 } … … 782 782 char hashbuf[KEYBUF_SIZE]; 783 783 784 784 int result; 785 785 size_t i; 786 786 787 787 SL_ENTER(_("sh_util_hmac_tiger")); 788 ASSERT((KEY_BLOCK <= (KEY_LEN/2)), _("KEY_BLOCK <= (KEY_LEN/2)")) 789 790 if (KEY_BLOCK > (KEY_LEN/2)) 791 { 792 (void) sh_tiger_hash (NULL, TIGER_DATA, 0, hashbuf, sizeof(hashbuf)); 793 sl_strlcpy(res, hashbuf, len); 794 SL_RETURN(res, _("sh_util_hmac_tiger")); 795 } 788 789 ASSERT((KEY_BLOCK <= (KEY_LEN/2)), _("KEY_BLOCK <= (KEY_LEN/2)")); 796 790 797 791 memcpy (K, zap, KEY_BLOCK); 798 792 799 if (sh_util_hextobinary (K, hexkey, KEY_LEN) < 0) 800 { 801 (void) sh_tiger_hash (NULL, TIGER_DATA, 0, hashbuf, sizeof(hashbuf)); 802 sl_strlcpy(res, hashbuf, len); 803 SL_RETURN(res, _("sh_util_hmac_tiger")); 804 } 805 806 if (sl_ok_adds(textlen, KEY_BLOCK)) 793 result = sh_util_hextobinary (K, hexkey, KEY_LEN); 794 795 ASSERT((result >= 0), _("result >= 0")); 796 797 if ((result >= 0) && sl_ok_adds(textlen, KEY_BLOCK)) 807 798 { 808 799 inner = (char *) SH_ALLOC (textlen + KEY_BLOCK); … … 830 821 /* now compute the hash 831 822 */ 832 h1 = sh_tiger_hash_uint32 ( outer, 833 TIGER_DATA, 834 KEY_BLOCK, 823 h1 = sh_tiger_hash_uint32 ( outer, TIGER_DATA, KEY_BLOCK, 835 824 kbuf, KEY_BYT/sizeof(UINT32)); 836 825 for (i = 0; i < (KEY_LEN/8); ++i) 837 { 838 /* cc[i] = h1[i]; */ 839 copy_four ( (unsigned char *) &(cc[i]), h1[i]); 840 } 841 842 h2 = sh_tiger_hash_uint32 ( inner, 843 TIGER_DATA, 826 copy_four ( (unsigned char *) &(cc[i]), h1[i]); 827 828 h2 = sh_tiger_hash_uint32 ( inner, TIGER_DATA, 844 829 (unsigned long) KEY_BLOCK+textlen, 845 830 kbuf, KEY_BYT/sizeof(UINT32)); 846 831 for (i = KEY_LEN/8; i < (KEY_LEN/4); ++i) 847 { 848 copy_four ( (unsigned char *) &(cc[i]), h2[i - (KEY_LEN/8)]); 849 /* cc[i] = h2[i - (KEY_LEN/8)]; */ 850 } 832 copy_four ( (unsigned char *) &(cc[i]), h2[i - (KEY_LEN/8)]); 833 851 834 SH_FREE(inner); 852 835 … … 1033 1016 1034 1017 1035 /* interval [0, 429496729 6]1018 /* interval [0, 4294967295] 1036 1019 */ 1037 1020 static UINT32 taus_get_long (void *vstate) … … 1160 1143 char bufx[9 * sizeof(UINT32) + 1]; 1161 1144 int status; 1162 static unsigned long seed_time = 0; 1145 static unsigned long seed_time = 0; 1146 static unsigned long seed_counter = 3000; 1163 1147 unsigned long gtime; 1164 1148 … … 1167 1151 if (skey->rngI == GOOD) 1168 1152 { 1169 if ( (sh_unix_longtime () - seed_time) < 7200) 1153 ++seed_counter; 1154 1155 if ( ((sh_unix_longtime () - seed_time) < 1800) && 1156 ( seed_counter < 3000)) 1170 1157 SL_RETURN( (0), _("taus_seed")); 1171 1158 } 1172 1159 1173 seed_time = sh_unix_longtime (); 1160 seed_time = sh_unix_longtime (); 1161 seed_counter = 0; 1174 1162 1175 1163 status = sh_entropy (24, bufx); … … 1834 1822 int sh_util_obscurename (ShErrLevel level, const char * name_orig, int flag) 1835 1823 { 1836 const unsigned char * name = ( unsigned char *) name_orig;1824 const unsigned char * name = (const unsigned char *) name_orig; 1837 1825 char * safe; 1838 1826 unsigned int i; … … 2308 2296 unsigned char b; 2309 2297 size_t lout = 0; 2310 intw = 0;2298 unsigned int w = 0; 2311 2299 2312 2300 if (out && in) -
trunk/src/sh_utmp.c
r474 r481 848 848 * by longjmp' warning. And no, 'volatile' proved insufficient. 849 849 */ 850 static void * sh_dummy_userold = NULL;851 static void * sh_dummy_user = NULL;850 void * sh_dummy_850_userold = NULL; 851 void * sh_dummy_851_user = NULL; 852 852 853 853 … … 883 883 * Avoids the 'clobbered by longjmp' warning. 884 884 */ 885 sh_dummy_ userold = (void*) &userold;886 sh_dummy_ user = (void*) &user;885 sh_dummy_850_userold = (void*) &userold; 886 sh_dummy_851_user = (void*) &user; 887 887 888 888 /* ------- find user -------- … … 1133 1133 1134 1134 out: 1135 sh_dummy_ user = NULL;1136 sh_dummy_ userold = NULL;1135 sh_dummy_851_user = NULL; 1136 sh_dummy_850_userold = NULL; 1137 1137 1138 1138 SL_RET0(_("sh_utmp_addlogin")); -
trunk/src/slib.c
r476 r481 587 587 588 588 589 #if !defined (VA_COPY) 590 #if defined (__GNUC__) && defined (__PPC__) && (defined (_CALL_SYSV) || defined (_WIN32)) 591 #define VA_COPY(ap1, ap2) (*(ap1) = *(ap2)) 592 #elif defined (VA_COPY_AS_ARRAY) 593 #define VA_COPY(ap1, ap2) memmove ((ap1), (ap2), sizeof (va_list)) 594 #else /* va_list is a pointer */ 595 #define VA_COPY(ap1, ap2) ((ap1) = (ap2)) 596 #endif 597 #endif 598 589 599 #if !defined(HAVE_VSNPRINTF) || defined(HAVE_BROKEN_VSNPRINTF) 590 600 static … … 774 784 str[n-1] = '\0'; 775 785 #else 776 va_copy(vl2, vl);/* save the argument list */786 VA_COPY (vl2, vl); /* save the argument list */ 777 787 total = sl_printf_count (format, vl); 778 788 len = (int) total; … … 820 830 str[n-1] = '\0'; 821 831 #else 822 va_copy(vl2, vl);/* save the argument list */832 VA_COPY (vl2, vl); /* save the argument list */ 823 833 total = sl_printf_count (format, vl); 824 834 if (total < n) … … 1141 1151 static gid_t rgid_orig; 1142 1152 1143 static int uids_are_stored = S L_FALSE;1144 static int suid_is_set = S L_TRUE;1153 static int uids_are_stored = S_FALSE; 1154 static int suid_is_set = S_TRUE; 1145 1155 1146 1156 #ifdef HAVE_SETRESUID … … 1156 1166 int sl_is_suid() 1157 1167 { 1158 if (uids_are_stored == S L_FALSE)1168 if (uids_are_stored == S_FALSE) 1159 1169 { 1160 1170 if (getuid() == geteuid() && getgid() == getegid()) … … 1179 1189 { 1180 1190 SL_ENTER(_("sl_get_euid")); 1181 /* SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));*/1182 if (uids_are_stored == S L_TRUE)1191 /* SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE"));*/ 1192 if (uids_are_stored == S_TRUE) 1183 1193 *ret = euid; 1184 1194 else … … 1189 1199 uid_t sl_ret_euid() 1190 1200 { 1191 /* SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));*/1192 if (uids_are_stored == S L_TRUE)1201 /* SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE"));*/ 1202 if (uids_are_stored == S_TRUE) 1193 1203 return (euid); 1194 1204 else … … 1203 1213 { 1204 1214 SL_ENTER(_("sl_get_egid")); 1205 /* SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));*/1206 if (uids_are_stored == S L_TRUE)1215 /* SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE"));*/ 1216 if (uids_are_stored == S_TRUE) 1207 1217 *ret = egid; 1208 1218 else … … 1218 1228 { 1219 1229 SL_ENTER(_("sl_get_ruid")); 1220 /* SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));*/1221 if (uids_are_stored == S L_TRUE)1230 /* SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE"));*/ 1231 if (uids_are_stored == S_TRUE) 1222 1232 *ret = ruid; 1223 1233 else … … 1233 1243 { 1234 1244 SL_ENTER(_("sl_get_rgid")); 1235 /* SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));*/1236 if (uids_are_stored == S L_TRUE)1245 /* SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE"));*/ 1246 if (uids_are_stored == S_TRUE) 1237 1247 *ret = rgid; 1238 1248 else … … 1248 1258 { 1249 1259 SL_ENTER(_("sl_get_ruid_orig")); 1250 /* SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));*/1251 if (uids_are_stored == S L_TRUE)1260 /* SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE"));*/ 1261 if (uids_are_stored == S_TRUE) 1252 1262 *ret = ruid_orig; 1253 1263 else … … 1263 1273 { 1264 1274 SL_ENTER(_("sl_get_rgid_orig")); 1265 /* SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));*/1266 if (uids_are_stored == S L_TRUE)1275 /* SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE"));*/ 1276 if (uids_are_stored == S_TRUE) 1267 1277 *ret = rgid_orig; 1268 1278 else … … 1289 1299 SL_ENTER(_("sl_set_suid")); 1290 1300 1291 if (uids_are_stored == S L_FALSE)1301 if (uids_are_stored == S_FALSE) 1292 1302 { 1293 1303 SL_IRETURN(SL_ENONE, _("sl_set_suid")); 1294 1304 } 1295 1305 1296 SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));1306 SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE")); 1297 1307 1298 1308 if (ruid == euid && rgid == egid) 1299 1309 { 1300 suid_is_set = S L_TRUE;1310 suid_is_set = S_TRUE; 1301 1311 SL_IRETURN(SL_ENONE, _("sl_set_suid")); 1302 1312 } 1303 SL_REQUIRE(suid_is_set == S L_FALSE, _("suid_is_set == SL_FALSE"));1313 SL_REQUIRE(suid_is_set == S_FALSE, _("suid_is_set == S_FALSE")); 1304 1314 1305 1315 #if defined(HAVE_SETRESUID) … … 1330 1340 1331 1341 SL_REQUIRE(retval == 0, _("retval == 0")); 1332 suid_is_set = S L_TRUE;1342 suid_is_set = S_TRUE; 1333 1343 SL_IRETURN(SL_ENONE, _("sl_set_suid")); 1334 1344 } … … 1344 1354 SL_ENTER(_("sl_unset_suid")); 1345 1355 1346 if (uids_are_stored == S L_FALSE)1356 if (uids_are_stored == S_FALSE) 1347 1357 { 1348 1358 SL_IRETURN(SL_ENONE, _("sl_unset_suid")); 1349 1359 } 1350 1360 1351 SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));1361 SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE")); 1352 1362 1353 1363 if (ruid == euid && rgid == egid) 1354 1364 { 1355 suid_is_set = S L_FALSE;1365 suid_is_set = S_FALSE; 1356 1366 SL_IRETURN(SL_ENONE, _("sl_unset_suid")); 1357 1367 } 1358 SL_REQUIRE(suid_is_set == S L_TRUE, _("suid_is_set == SL_TRUE"));1368 SL_REQUIRE(suid_is_set == S_TRUE, _("suid_is_set == S_TRUE")); 1359 1369 1360 1370 #if defined(HAVE_SETRESUID) … … 1384 1394 1385 1395 SL_REQUIRE(retval == 0, _("retval == 0")); 1386 suid_is_set = S L_FALSE;1396 suid_is_set = S_FALSE; 1387 1397 SL_IRETURN(SL_ENONE, _("sl_unset_suid")); 1388 1398 } … … 1395 1405 { 1396 1406 SL_ENTER(_("sl_save_uids")); 1397 if (uids_are_stored == S L_TRUE)1407 if (uids_are_stored == S_TRUE) 1398 1408 SL_IRETURN(SL_EREPEAT, _("sl_save_uids")); 1399 1409 … … 1404 1414 ruid = ruid_orig; 1405 1415 rgid = rgid_orig; 1406 uids_are_stored = S L_TRUE;1416 uids_are_stored = S_TRUE; 1407 1417 1408 1418 SL_IRETURN(SL_ENONE, _("sl_save_uids")); … … 1417 1427 { 1418 1428 SL_ENTER(_("sl_drop_privileges")); 1419 SL_REQUIRE(uids_are_stored == S L_TRUE, _("uids_are_stored == SL_TRUE"));1429 SL_REQUIRE(uids_are_stored == S_TRUE, _("uids_are_stored == S_TRUE")); 1420 1430 1421 1431 SL_REQUIRE(setgid(rgid_orig) == 0, _("setgid(rgid_orig) == 0")); … … 1442 1452 { 1443 1453 SL_ENTER(_("sl_policy_get_root")); 1444 SL_REQUIRE(uids_are_stored == S L_FALSE, _("uids_are_stored == SL_FALSE"));1454 SL_REQUIRE(uids_are_stored == S_FALSE, _("uids_are_stored == S_FALSE")); 1445 1455 1446 1456 SL_REQUIRE (sl_save_uids() == SL_ENONE, _("sl_save_uids() == SL_ENONE")); … … 1455 1465 rgid = egid; 1456 1466 } 1457 suid_is_set = S L_TRUE;1467 suid_is_set = S_TRUE; 1458 1468 if (euid == 0) 1459 1469 { … … 1474 1484 { 1475 1485 SL_ENTER(_("sl_policy_get_real")); 1476 SL_REQUIRE(uids_are_stored == S L_FALSE, _("uids_are_stored == SL_FALSE"));1486 SL_REQUIRE(uids_are_stored == S_FALSE, _("uids_are_stored == S_FALSE")); 1477 1487 SL_REQUIRE (sl_save_uids() == SL_ENONE, _("sl_save_uids() == SL_ENONE")); 1478 1488 … … 1507 1517 _("sl_drop_privileges() == SL_ENONE")); 1508 1518 1509 suid_is_set = S L_TRUE;1519 suid_is_set = S_TRUE; 1510 1520 SL_IRETURN(SL_ENONE, _("sl_policy_get_real")); 1511 1521 } … … 1522 1532 1523 1533 SL_REQUIRE(user != NULL, _("user != NULL")); 1524 SL_REQUIRE(uids_are_stored == S L_FALSE, _("uids_are_stored == SL_FALSE"));1534 SL_REQUIRE(uids_are_stored == S_FALSE, _("uids_are_stored == S_FALSE")); 1525 1535 SL_REQUIRE (sl_save_uids() == SL_ENONE, _("sl_save_uids() == SL_ENONE")); 1526 1536 … … 1778 1788 ofiles[fd]->content = NULL; 1779 1789 ofiles[fd]->stream = stream; 1780 ofiles[fd]->flush = S L_FALSE;1790 ofiles[fd]->flush = S_FALSE; 1781 1791 1782 1792 sl_strlcpy(ofiles[fd]->ofile, ofile, SL_OFILE_SIZE); … … 2058 2068 ofiles[fd]->content = NULL; 2059 2069 ofiles[fd]->stream = NULL; 2060 ofiles[fd]->flush = S L_FALSE;2070 ofiles[fd]->flush = S_FALSE; 2061 2071 2062 2072 sl_strlcpy(ofiles[fd]->ofile, ofile, SL_OFILE_SIZE); … … 2182 2192 #endif 2183 2193 2184 static int sl_drop_cache = S L_FALSE;2194 static int sl_drop_cache = S_FALSE; 2185 2195 2186 2196 int sl_set_drop_cache(const char * str) … … 2203 2213 #if defined(HAVE_POSIX_FADVISE) && defined(HAVE_MINCORE) && defined(POSIX_FADV_DONTNEED) 2204 2214 2205 if (S L_FALSE != sl_drop_cache && !SL_ISERROR(status))2215 if (S_FALSE != sl_drop_cache && !SL_ISERROR(status)) 2206 2216 { 2207 2217 int fd = get_the_fd(status); … … 2209 2219 { 2210 2220 if (0 == sl_check_mincore(fd)) 2211 ofiles[fd]->flush = S L_TRUE;2221 ofiles[fd]->flush = S_TRUE; 2212 2222 } 2213 2223 } … … 2345 2355 { 2346 2356 #if defined(HAVE_POSIX_FADVISE) && defined(HAVE_MINCORE) && defined(POSIX_FADV_DONTNEED) 2347 if (ofiles[fd]->flush == S L_TRUE)2357 if (ofiles[fd]->flush == S_TRUE) 2348 2358 { 2349 2359 posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); … … 2569 2579 extern volatile int sig_termfast; 2570 2580 2571 if (is_nonblocking == S L_FALSE)2581 if (is_nonblocking == S_FALSE) 2572 2582 { 2573 2583 /* set to non-blocking mode … … 2620 2630 { 2621 2631 error = errno; 2622 if (is_nonblocking == S L_FALSE)2632 if (is_nonblocking == S_FALSE) 2623 2633 retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags); 2624 2634 TPT(( 0, FIL__, __LINE__, _("msg=<read error>"))); … … 2637 2647 else if (retval == 0) 2638 2648 { 2639 if (is_nonblocking == S L_FALSE)2649 if (is_nonblocking == S_FALSE) 2640 2650 retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags); 2641 2651 TPT(( 0, FIL__, __LINE__, _("msg=<timeout>"))); … … 2648 2658 { 2649 2659 error = errno; 2650 if (is_nonblocking == S L_FALSE)2660 if (is_nonblocking == S_FALSE) 2651 2661 retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags); 2652 2662 TPT(( 0, FIL__, __LINE__, _("msg=<timeout>"))); … … 2657 2667 if (sig_termfast == 1) 2658 2668 { 2659 if (is_nonblocking == S L_FALSE)2669 if (is_nonblocking == S_FALSE) 2660 2670 retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags); 2661 2671 TPT(( 0, FIL__, __LINE__, _("msg=<terminated>"))); … … 2669 2679 if (tdiff > timeout) 2670 2680 { 2671 if (is_nonblocking == S L_FALSE)2681 if (is_nonblocking == S_FALSE) 2672 2682 retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags); 2673 2683 TPT(( 0, FIL__, __LINE__, _("msg=<timeout>"))); … … 2679 2689 } 2680 2690 2681 if (is_nonblocking == S L_FALSE)2691 if (is_nonblocking == S_FALSE) 2682 2692 retry_fcntl(FIL__, __LINE__, fd, F_SETFL, sflags); 2683 2693 return ((int) bytes); … … 2888 2898 2889 2899 extern uid_t rootonly[]; 2890 extern int EUIDSLOT;2891 extern int ORIG_EUIDSLOT;2900 extern unsigned int EUIDSLOT; 2901 extern unsigned int ORIG_EUIDSLOT; 2892 2902 2893 2903 extern char tf_path[MAXFILENAME]; /* Error path for trust function. */ … … 2998 3008 int sl_trust_purge_user (void) 2999 3009 { 3000 int i;3010 unsigned int i; 3001 3011 3002 3012 EUIDSLOT = ORIG_EUIDSLOT; … … 3074 3084 { 3075 3085 long status; 3076 static time_t old = 0;3077 static time_t now;3086 static size_t old = 0; 3087 static size_t now; 3078 3088 3079 3089 SL_ENTER(_("sl_trustfile_euid")); … … 3084 3094 3085 3095 now = time(NULL); 3096 3086 3097 if (now < (old + 300)) 3087 3098 { … … 3119 3130 { 3120 3131 if ((b == 0) || (a >= (INT_MIN / b) && a <= (INT_MAX / b))) 3121 return S L_TRUE; /* no overflow */3122 return S L_FALSE;3132 return S_TRUE; /* no overflow */ 3133 return S_FALSE; 3123 3134 } 3124 3135 … … 3126 3137 { 3127 3138 if ((b == 0) || (a <= (SIZE_MAX / b))) 3128 return S L_TRUE; /* no overflow */3129 return S L_FALSE;3139 return S_TRUE; /* no overflow */ 3140 return S_FALSE; 3130 3141 } 3131 3142 … … 3134 3145 (void) a; 3135 3146 if (b != 0) 3136 return S L_TRUE; /* no overflow */3137 return S L_FALSE;3147 return S_TRUE; /* no overflow */ 3148 return S_FALSE; 3138 3149 } 3139 3150 … … 3143 3154 { 3144 3155 if (a <= (INT_MAX - b)) 3145 return S L_TRUE; /* no overflow */3156 return S_TRUE; /* no overflow */ 3146 3157 else 3147 return S L_FALSE;3158 return S_FALSE; 3148 3159 } 3149 3160 else if (a < 0 && b < 0) 3150 3161 { 3151 3162 if (a >= (INT_MIN - b)) 3152 return S L_TRUE; /* no overflow */3163 return S_TRUE; /* no overflow */ 3153 3164 else 3154 return S L_FALSE;3155 } 3156 return S L_TRUE;3165 return S_FALSE; 3166 } 3167 return S_TRUE; 3157 3168 } 3158 3169 … … 3160 3171 { 3161 3172 if (a <= (SIZE_MAX - b)) 3162 return S L_TRUE; /* no overflow */3173 return S_TRUE; /* no overflow */ 3163 3174 else 3164 return S L_FALSE;3175 return S_FALSE; 3165 3176 } 3166 3177 … … 3170 3181 { 3171 3182 if (a <= (INT_MAX + b)) 3172 return S L_TRUE; /* no overflow */3183 return S_TRUE; /* no overflow */ 3173 3184 else 3174 return S L_FALSE;3185 return S_FALSE; 3175 3186 } 3176 3187 else if (a < 0 && b >= 0) 3177 3188 { 3178 3189 if (a >= (INT_MIN + b)) 3179 return S L_TRUE; /* no overflow */3190 return S_TRUE; /* no overflow */ 3180 3191 else 3181 return S L_FALSE;3182 } 3183 return S L_TRUE;3184 } 3192 return S_FALSE; 3193 } 3194 return S_TRUE; 3195 } -
trunk/src/t-test1.c
r454 r481 230 230 if(m->size > 0) free(m->ptr); 231 231 m->ptr = (unsigned char *)memalign(sizeof(int) << r, size); 232 /* fprintf(stderr, "FIXME memalign %p\n", m->ptr); */233 232 ++n_memalign; 234 233 } else if(r < 20) { /* calloc */ … … 246 245 #endif 247 246 ++n_calloc; 248 /* fprintf(stderr, "FIXME calloc %p\n", m->ptr); */249 247 } else if(r < 100 && m->size < REALLOC_MAX) { /* realloc */ 250 248 if(m->size == 0) m->ptr = NULL; 251 249 m->ptr = realloc(m->ptr, size); 252 /* fprintf(stderr, "FIXME realloc %p\n", m->ptr); */253 250 ++n_realloc; 254 251 } else { /* plain malloc */ 255 252 if(m->size > 0) free(m->ptr); 256 253 m->ptr = (unsigned char *)malloc(size); 257 /* fprintf(stderr, "FIXME malloc %p\n", m->ptr); */258 254 ++n_malloc; 259 255 } -
trunk/src/trustfile.c
r474 r481 102 102 103 103 104 #if ndef TRUST_MAIN104 #if !defined(TRUST_MAIN) 105 105 106 106 #include "slib.h" … … 121 121 122 122 #define TRUST_DEBUG 123 #define S L_FALSE 0124 #define S L_TRUE 1123 #define S_FALSE 0 124 #define S_TRUE 1 125 125 #define SL_ENTER(string) 126 126 #define SL_IRETURN(a, b) return a … … 222 222 223 223 uid_t tf_euid = tf_uid_neg; 224 int EUIDSLOT = sizeof(test_rootonly)/sizeof(uid_t);225 int ORIG_EUIDSLOT = sizeof(test_rootonly)/sizeof(uid_t);224 unsigned int EUIDSLOT = sizeof(test_rootonly)/sizeof(uid_t); 225 unsigned int ORIG_EUIDSLOT = sizeof(test_rootonly)/sizeof(uid_t); 226 226 227 227 char tf_path[MAXFILENAME]; /* error path for trust function */ … … 381 381 SL_ENTER(_("isin")); 382 382 if (list == NULL) 383 SL_IRETURN(S L_FALSE, _("isin"));383 SL_IRETURN(S_FALSE, _("isin")); 384 384 385 385 while(*list != tf_uid_neg && *list != n) … … 400 400 (UID_CAST) n); 401 401 #endif 402 SL_IRETURN(S L_FALSE, _("isin"));402 SL_IRETURN(S_FALSE, _("isin")); 403 403 } 404 404 … … 408 408 (UID_CAST)n, (UID_CAST)*list); 409 409 #endif 410 SL_IRETURN(S L_TRUE, _("isin"));410 SL_IRETURN(S_TRUE, _("isin")); 411 411 } 412 412 … … 506 506 if (pbuffer) free(pbuffer); 507 507 #endif 508 SL_IRETURN(S L_FALSE, _("isingrp"));508 SL_IRETURN(S_FALSE, _("isingrp")); 509 509 510 510 end_true: … … 513 513 if (pbuffer) free(pbuffer); 514 514 #endif 515 SL_IRETURN(S L_TRUE, _("isingrp"));515 SL_IRETURN(S_TRUE, _("isingrp")); 516 516 } 517 517 … … 537 537 #endif 538 538 539 int retval = S L_FALSE;539 int retval = S_FALSE; 540 540 541 541 SL_ENTER(_("onlytrustedingrp")); … … 567 567 (UID_CAST)grp); 568 568 #endif 569 retval = S L_FALSE;569 retval = S_FALSE; 570 570 goto end_retval; 571 571 } … … 574 574 575 575 if(g->gr_mem == NULL || g->gr_mem[0] == NULL ) 576 SL_IRETURN(S L_TRUE, _("onlytrustedingrp") );576 SL_IRETURN(S_TRUE, _("onlytrustedingrp") ); 577 577 */ 578 578 … … 640 640 #endif 641 641 tf_baduid = w->pw_uid; 642 retval = S L_FALSE;642 retval = S_FALSE; 643 643 #if defined(HAVE_PTHREAD) && defined (_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R) 644 644 if (pbuffer) free(pbuffer); … … 698 698 #endif 699 699 tf_baduid = w->pw_uid; 700 retval = S L_FALSE;700 retval = S_FALSE; 701 701 goto out; 702 /* SL_IRETURN(S L_FALSE, _("onlytrustedingrp")); */703 } 704 } 705 } 706 retval = S L_TRUE;702 /* SL_IRETURN(S_FALSE, _("onlytrustedingrp")); */ 703 } 704 } 705 } 706 retval = S_TRUE; 707 707 708 708 out: … … 720 720 721 721 #ifdef TRUST_DEBUG 722 if (retval == S L_TRUE)722 if (retval == S_TRUE) 723 723 fprintf(stderr, 724 724 "trustfile: group %ld: all members are trusted users --> OK\n", … … 849 849 char * csym; /* contents of symlink file */ 850 850 char * full; /* "full" name of symlink */ 851 register char *b, *t; /* used to copy stuff around */ 852 register int lsym; /* num chars in symlink ref */ 853 register int i; /* trustworthy or not? */ 851 char *b; /* used to copy stuff around */ 852 const char *t; /* used to copy stuff around */ 853 int lsym; /* num chars in symlink ref */ 854 int i; /* trustworthy or not? */ 854 855 const char * t_const; 855 856 char *end; … … 915 916 /* smack on the /../ 916 917 */ 917 t_const = "/../"; t = (c har *)t_const;918 t_const = "/../"; t = (const char *)t_const; 918 919 while(*t && b < end) 919 920 *b++ = *t++; … … 997 998 * file regardless of permissions, so bomb 998 999 */ 999 if (((okusers != NULL && S L_FALSE == isin((uid_t)stbuf.st_uid,okusers))||1000 (badusers != NULL && S L_TRUE == isin((uid_t)stbuf.st_uid,badusers))))1000 if (((okusers != NULL && S_FALSE == isin((uid_t)stbuf.st_uid,okusers))|| 1001 (badusers != NULL && S_TRUE == isin((uid_t)stbuf.st_uid,badusers)))) 1001 1002 { 1002 1003 #ifdef TRUST_DEBUG -
trunk/src/yulectl.c
r454 r481 24 24 #include <stdlib.h> 25 25 #include <string.h> 26 #include <ctype.h> 26 27 #include <errno.h> 27 28 … … 41 42 #define SH_MAXMSG 209 42 43 44 #if !defined(HAVE_GETPEEREID) && !defined(SO_PEERCRED) && \ 45 !defined(HAVE_STRUCT_CMSGCRED) && !defined(HAVE_STRUCT_FCRED) && \ 46 !(defined(HAVE_STRUCT_SOCKCRED) && defined(LOCAL_CREDS)) 47 #define SH_REQ_PASSWORD 1 48 #endif 49 43 50 static int sock = -1; 44 static char * sockname = NULL;45 46 51 static char password[15] = ""; 47 48 52 static int verbose = 0; 49 53 … … 86 90 87 91 88 int89 make_named_socket (char * sockname)92 static int 93 create_unix_socket () 90 94 { 91 95 int sock; 92 93 #if 094 struct sockaddr_un name;95 size_t size;96 #else97 (void) sockname;98 #endif99 96 100 97 /* Create the socket. */ … … 107 104 } 108 105 109 #if 0110 /* Bind a name to the socket. */111 name.sun_family = AF_FILE;112 strcpy (name.sun_path, sockname);113 114 /* The size of the address is115 the offset of the start of the filename,116 plus its length,117 plus one for the terminating null byte. */118 size = (offsetof (struct sockaddr_un, sun_path)119 + strlen (name.sun_path) + 1);120 121 if (bind (sock, (struct sockaddr *) &name, size) < 0)122 {123 perror (_("ERROR: bind"));124 return -1;125 }126 #endif127 128 106 return sock; 129 107 } 130 108 131 void109 static void 132 110 termination_handler (int signum) 133 111 { … … 138 116 fprintf(stdout, _("# Terminated on signal %d\n"), signum); 139 117 } 140 #if 0 141 if (sockname != NULL) unlink (sockname); 142 #endif 143 if (sock >= 0 ) close (sock); 144 118 if (sock >= 0 ) 119 close (sock); 145 120 return; 146 121 } 147 122 148 149 int send_to_server (char * serversock, char * message) 123 static char * safe_copy(char * to, const char * from, size_t size) 124 { 125 if (to && from) 126 { 127 strncpy (to, from, size); 128 if (size > 0) 129 to[size-1] = '\0'; 130 else 131 *to = '\0'; 132 } 133 return to; 134 } 135 136 137 static int send_to_server (char * serversock, char * message) 150 138 { 151 139 struct sockaddr_un name; 152 /* size_t size; */153 140 int size; 154 141 int nbytes; … … 168 155 } 169 156 170 /* Send the datagram. 171 nbytes = sendto (sock, message, strlen (message) + 1, 0, 172 (struct sockaddr *) & name, size); 157 /* Send the data. 173 158 */ 174 159 nbytes = send (sock, message, strlen (message) + 1, 0); 175 176 160 if (nbytes < 0) 177 161 { … … 205 189 } 206 190 207 int recv_from_server (char * message)191 static int recv_from_server (char * message) 208 192 { 209 193 int nbytes = 0; … … 211 195 int num = 0; 212 196 int good = -1; 213 int islist = 0;214 197 char * p; 215 198 216 199 if (password[0] == '\0') 217 { 218 if (message[0] == 'L' && message[1] == 'I' && 219 message[2] == 'S' && message[3] == 'T') 220 { 221 islist = 1; 222 } 223 if (message[0] == 'P' && message[1] == 'R' && 224 message[2] == 'O' && message[3] == 'B' && message[4] == 'E' ) 225 { 226 islist = 1; 227 } 228 } 200 p = message; 229 201 else 230 { 231 p = &message[strlen(password)+1]; 232 if (p[0] == 'L' && p[1] == 'I' && 233 p[2] == 'S' && p[3] == 'T') 234 { 235 islist = 1; 236 } 237 if (p[0] == 'P' && p[1] == 'R' && 238 p[2] == 'O' && p[3] == 'B' && p[4] == 'E' ) 239 { 240 islist = 1; 241 } 242 } 243 244 if (islist == 1) 202 p = &message[strlen(password)+1]; 203 204 if (0 == strncmp(p, _("PROBE"), 5) || 205 0 == strncmp(p, _("LIST"), 4)) 245 206 { 246 207 do { 247 /*248 nbytes = recvfrom (sock, recvmsg, SH_MAXMSG, 0, NULL, 0);249 */250 208 nbytes = getline_from_server (sock, recvmsg, SH_MAXMSG); 251 209 if (nbytes < 0) 252 210 { 253 211 if (errno == EAGAIN) 254 { 255 return 0; 256 } 212 return 0; 257 213 else 258 214 { … … 262 218 } 263 219 else if (nbytes == 0) 264 { 265 return 0; 266 } 220 return 0; 221 267 222 if (recvmsg[0] == 'E' && recvmsg[1] == 'N' && recvmsg[2] == 'D') 268 223 { … … 277 232 else 278 233 { 279 /*280 nbytes = recvfrom (sock, recvmsg, SH_MAXMSG, 0, NULL, 0);281 */282 234 nbytes = recv (sock, recvmsg, SH_MAXMSG, 0); 283 235 if (nbytes < 0) … … 290 242 /* Print a diagnostic message. */ 291 243 if (password[0] == '\0') 292 { 293 good = strcmp (message, recvmsg); 294 } 244 good = strcmp (message, recvmsg); 295 245 else 296 { 297 good = strcmp (&message[strlen(password)+1], recvmsg); 298 } 246 good = strcmp (&message[strlen(password)+1], recvmsg); 299 247 300 248 if (0 != good) 301 249 { 302 fprintf (stderr, "%s", _("ERROR: Bounced message != original message (possible reason: superfluous password).\n")); 250 if (0 == strncmp(recvmsg, _("!E:"), 3)) 251 { 252 fputs(recvmsg, stderr); 253 fputc('\n', stderr); 254 } 255 else 256 { 257 fputs (_("ERROR: Bounced message != original message.\n"), stderr); 258 } 303 259 return -1; 304 260 } … … 312 268 } 313 269 314 void usage(char * name) 270 static int check_uuid(const char * in) 271 { 272 int i; 273 const char *cp; 274 275 if (!in || strlen(in) != 36) 276 return -1; 277 for (i=0, cp = in; i <= 36; i++,cp++) { 278 if ((i == 8) || (i == 13) || (i == 18) || 279 (i == 23)) { 280 if (*cp == '-') 281 continue; 282 else 283 return -1; 284 } 285 if (i== 36) 286 if (*cp == 0) 287 continue; 288 if (!isxdigit(*cp)) 289 return -1; 290 } 291 return 0; 292 } 293 294 static int check_command(const char * str) 295 { 296 unsigned int i = 0; 297 char * commands[] = { N_("DELTA:"), N_("RELOAD"), N_("STOP"), N_("SCAN"), 298 N_("CANCEL"), N_("LISTALL"), N_("LIST"), N_("PROBE"), NULL }; 299 300 while (commands[i]) 301 { 302 size_t len = strlen(_(commands[i])); 303 304 if (0 == strncmp(_(commands[i]), str, len)) 305 { 306 if (i == 0) 307 { 308 char * p = strchr(str, ':'); ++p; 309 if ( 0 == check_uuid(p) ) 310 return 0; 311 } 312 else 313 { 314 if (len == strlen(str)) 315 return 0; 316 } 317 } 318 ++i; 319 } 320 321 fprintf (stderr, _("ERROR: invalid command <%s>\n\n"), str); 322 return -1; 323 } 324 325 static void print_usage_and_exit(char * name, int exit_status) 315 326 { 316 327 printf(_("\nUsage : %s [-v][-s server_socket] -c command <client_hostname>\n\n"), … … 325 336 printf("%s", _(" variable YULECTL_PASSWORD (not recommended).\n\n")); 326 337 327 printf("%s", _("Commands: RELOAD <reload configuration>\n")); 328 printf("%s", _(" STOP <terminate>\n")); 329 printf("%s", _(" SCAN <initiate file system check\n")); 330 printf("%s", _(" CANCEL <cancel previous command>\n")); 331 printf("%s", _(" LIST <list queued commands>\n")); 332 printf("%s", _(" LISTALL <list queued and last sent commands>\n")); 333 printf("%s", _(" PROBE <probe all clients for necessity of reload>\n")); 334 return; 338 printf("%s", _("Commands: RELOAD reload configuration\n")); 339 printf("%s", _(" DELTA:<uuid> load delta database with given uuid\n")); 340 printf("%s", _(" STOP terminate\n")); 341 printf("%s", _(" SCAN initiate file system check\n")); 342 printf("%s", _(" CANCEL cancel pending command(s)\n")); 343 printf("%s", _(" LIST list queued commands\n")); 344 printf("%s", _(" LISTALL list queued and last sent commands\n")); 345 printf("%s", _(" PROBE probe all clients for necessity of reload\n")); 346 exit(exit_status); 335 347 } 336 348 … … 339 351 size_t len; 340 352 341 if (!str) 342 return str; 353 if (!str) return str; 343 354 344 355 len = strlen(str); … … 351 362 break; 352 363 } 353 354 364 return str; 355 365 } 356 366 357 void fixup_message (char * message) 358 { 359 char message2[SH_MAXMSG]; 360 char home[4096]; 361 FILE * fp; 367 static int get_home(char * home, size_t size) 368 { 362 369 struct passwd * pwent; 363 char * pw; 364 365 pw = getenv(_("YULECTL_PASSWORD")); 366 if (pw && strlen(pw) < 15) 367 { 368 strcpy(password, pw); 369 strcpy(message2, password); 370 goto do_msg; 371 } 372 370 373 371 pwent = getpwuid(geteuid()); 374 372 if ((pwent == 0) || (pwent->pw_dir == NULL)) … … 379 377 if (NULL != getenv(_("HOME"))) 380 378 { 381 strncpy(home, getenv(_("HOME")), 4096); 382 home[4095] = '\0'; 379 safe_copy(home, getenv(_("HOME")), size); 383 380 } 384 381 else 385 382 { 386 383 fprintf (stderr, _("ERROR: no home directory for euid %ld (tried $HOME and password database).\n"), (long) geteuid()); 387 exit(EXIT_FAILURE);384 return -1; 388 385 } 389 386 } 390 387 else 391 388 { 392 strncpy(home, pwent->pw_dir, 4096); 393 home[4095] = '\0'; 394 } 389 safe_copy(home, pwent->pw_dir, size); 390 } 391 return 0; 392 } 393 394 static int get_passwd(char * message2, size_t size) 395 { 396 char home[4096]; 397 FILE * fp; 398 char * pw; 399 400 /* 1) Password from environment 401 */ 402 pw = getenv(_("YULECTL_PASSWORD")); 403 if (pw && strlen(pw) < 15) 404 { 405 strcpy(password, pw); 406 strcpy(message2, password); 407 return 0; 408 } 409 410 /* 2) Password from $HOME/.yule_cred 411 */ 412 if (get_home(home, sizeof(home)) < 0) 413 return -1; 395 414 396 415 if ( (strlen(home) + strlen(_("/.yulectl_cred")) + 1) > 4096) 397 416 { 398 417 fprintf (stderr, "%s", _("ERROR: path for $HOME is too long.\n")); 399 exit(EXIT_FAILURE);418 return -1; 400 419 } 401 420 strcat(home, _("/.yulectl_cred")); 402 421 fp = fopen(home, "r"); 403 422 404 #if !defined(HAVE_GETPEEREID) && !defined(SO_PEERCRED) && !defined(HAVE_STRUCT_CMSGCRED) && !defined(HAVE_STRUCT_FCRED) && !(defined(HAVE_STRUCT_SOCKCRED) && defined(LOCAL_CREDS))423 #if defined(SH_REQ_PASSWORD) 405 424 if (fp == NULL) 406 425 { … … 415 434 home, (long)geteuid(), (long)getuid()); 416 435 } 417 exit(EXIT_FAILURE);436 return -1; 418 437 } 419 438 #else 420 439 if (fp == NULL) 421 return ;440 return 0; 422 441 #endif 423 442 424 if (NULL == fgets(message2, size of(message2), fp))443 if (NULL == fgets(message2, size, fp)) 425 444 { 426 445 fprintf (stderr, 427 446 _("ERROR: empty or unreadable password file (%s).\n"), 428 447 home); 429 exit(EXIT_FAILURE);448 return -1; 430 449 } 431 450 … … 436 455 fprintf (stderr, "%s", 437 456 _("ERROR: Password too long (max. 14 characters).\n")); 438 exit(EXIT_FAILURE); 439 } 440 457 return -1; 458 } 441 459 strcpy(password, message2); 442 460 fclose(fp); 443 461 444 do_msg: 445 strcat(message2, "@"); 446 447 strncat(message2, message, SH_MAXMSG - strlen(message2) -1); 448 message2[SH_MAXMSG-1] = '\0'; 449 strcpy(message, message2); 462 return 0; 463 } 464 465 static int fixup_message (char * message) 466 { 467 char message_fixed[SH_MAXMSG] = { 0 }; 468 469 if (get_passwd(message_fixed, sizeof(message_fixed)) < 0) 470 return -1; 471 472 if (strlen(message_fixed) > 0) 473 { 474 strcat(message_fixed, "@"); 475 476 strncat(message_fixed, message, SH_MAXMSG - strlen(message_fixed) -1); 477 message_fixed[SH_MAXMSG-1] = '\0'; 478 strcpy(message, message_fixed); 479 } 480 return 0; 481 } 482 483 static int fill_serversock(char * serversock, size_t size) 484 { 485 int status; 486 487 #ifdef HAVE_VSNPRINTF 488 status = snprintf(serversock, size, _("%s/%s.sock"), 489 DEFAULT_PIDDIR, SH_INSTALL_NAME); 490 #else 491 if ((strlen(DEFAULT_PIDDIR) + strlen(SH_INSTALL_NAME) + 1 + 6) > size) 492 status = -1; 493 else 494 status = sprintf (serversock, _("%s/%s.sock"), 495 DEFAULT_PIDDIR, SH_INSTALL_NAME); 496 #endif 497 498 if ((status < 0) || (status > (int)(size-1))) 499 { 500 fprintf(stderr, _("ERROR: Path too long (maximum %d): %s/%s.sock\n"), 501 (int) (size-1), DEFAULT_PIDDIR, SH_INSTALL_NAME); 502 return -1; 503 } 504 return 0; 505 } 506 507 static void checklen(char * command, char * str, size_t maxlen) 508 { 509 if (strlen(str) > maxlen) 510 { 511 fprintf(stderr, _("ERROR: String too long (max %d): %s\n\n"), 512 (int) maxlen, str); 513 print_usage_and_exit (command, EXIT_FAILURE); 514 } 450 515 return; 451 516 } 452 517 518 static void checknull(char * command, char * str) 519 { 520 if (str == NULL || str[0] == '\0') { 521 fprintf(stderr, "%s", _("ERROR: option with missing argument\n\n")); 522 print_usage_and_exit(command, EXIT_FAILURE); 523 } 524 return; 525 } 453 526 454 527 int … … 457 530 458 531 char message[SH_MAXMSG] = ""; 459 char clientcd[1024];460 532 char serversock[256]; 461 int status , size;533 int status; 462 534 int num = 1; 463 535 int flag = 0; 464 465 #ifdef HAVE_VSNPRINTF 466 status = snprintf(serversock, 256, _("%s/%s.sock"), 467 DEFAULT_PIDDIR, SH_INSTALL_NAME); 468 #else 469 if ((strlen(DEFAULT_PIDDIR) + strlen(SH_INSTALL_NAME) + 1 + 6) > 256) 470 { 471 status = -1; 472 } 473 else 474 { 475 status = sprintf (serversock, _("%s/%s.sock"), 476 DEFAULT_PIDDIR, SH_INSTALL_NAME); 477 } 478 #endif 479 480 if ((status < 0) || (status > 255)) 481 { 482 fprintf(stderr, _("ERROR: Path too long (maximum 255): %s/%s.sock\n"), 483 DEFAULT_PIDDIR, SH_INSTALL_NAME); 484 return (EXIT_FAILURE); 485 } 536 537 if (fill_serversock(serversock, sizeof(serversock)) < 0) 538 return (EXIT_FAILURE); 539 486 540 487 541 while (argc > 1 && argv[num][0] == '-') … … 490 544 { 491 545 case 'h': 492 usage(argv[0]); 493 return (EXIT_SUCCESS); 494 546 print_usage_and_exit(argv[0], EXIT_SUCCESS); 547 break; 495 548 case 'v': 496 549 ++verbose; 497 550 break; 498 499 551 case 's': 500 552 --argc; ++num; 501 if (argv[num] == NULL || argv[num][0] == '\0') { 502 usage(argv[0]); 503 fprintf(stderr, "%s", _("ERROR: -s: argument missing\n")); 504 return (EXIT_FAILURE); 505 } else { 506 if (strlen(argv[num]) > 255) 507 { 508 fprintf(stderr, _("ERROR: Path too long: %s\n"), argv[num]); 509 return (EXIT_FAILURE); 510 } 511 strncpy (serversock, argv[num], 256); 512 serversock[255] = '\0'; 513 } 553 checknull(argv[0], argv[num]); 554 checklen(argv[0], argv[num], sizeof(serversock)-1); 555 safe_copy (serversock, argv[num], sizeof(serversock)); 514 556 break; 515 516 557 case 'c': 517 558 --argc; ++num; 518 if (argv[num] == NULL || argv[num][0] == '\0') { 519 usage(argv[0]); 520 fprintf(stderr, "%s", _("ERROR: -c: argument missing\n")); 521 return (EXIT_FAILURE); 522 } else { 523 if (strlen(argv[num]) >= SH_MAXMSG) 524 { 525 fprintf(stderr, _("ERROR: Command too long: %s\n"), 526 argv[num]); 527 return (EXIT_FAILURE); 528 } 529 strncpy (message, argv[num], SH_MAXMSG); 530 message[SH_MAXMSG-1] = '\0'; 531 strncat(message, ":", SH_MAXMSG-strlen(message)-1); 532 message[SH_MAXMSG-1] = '\0'; 533 flag = 1; 534 } 559 checknull(argv[0], argv[num]); 560 checklen(argv[0], argv[num], SH_MAXMSG-1); 561 if (0 != check_command(argv[num])) 562 print_usage_and_exit(argv[0], EXIT_FAILURE); 563 safe_copy(message, argv[num], SH_MAXMSG); 564 strncat(message, ":", SH_MAXMSG-strlen(message)-1); 565 message[SH_MAXMSG-1] = '\0'; 566 flag = 1; 535 567 break; 536 537 568 default: 538 usage(argv[0]);539 fprintf(stderr, _("ERROR: unknown option -%c\n"), argv[num][1]);540 return (EXIT_FAILURE);569 fprintf(stderr, _("ERROR: unknown option -%c\n\n"), argv[num][1]); 570 print_usage_and_exit(argv[0], EXIT_FAILURE); 571 break; 541 572 } 542 573 --argc; ++num; … … 544 575 545 576 if (flag == 0) /* no command given */ 546 { 547 usage(argv[0]); 548 return (EXIT_FAILURE); 549 } 577 print_usage_and_exit(argv[0], EXIT_FAILURE); 550 578 551 579 if (argc > 1) 552 580 { 553 if (strlen(argv[num]) > (SH_MAXMSG - strlen(message) -1)) 554 { 555 fprintf(stderr, _("ERROR: Hostname too long: %s\n"), argv[num]); 556 return (EXIT_FAILURE); 557 } 558 strncat (message, argv[num], SH_MAXMSG -strlen(message) - 1); 581 checklen(argv[0], argv[num], SH_MAXMSG - strlen(message) - 1); 582 strncat (message, argv[num], SH_MAXMSG - strlen(message) - 1); 559 583 message[SH_MAXMSG-1] = '\0'; 560 584 } 561 585 else 562 586 { 563 if ( message[0] == 'P' && message[1] == 'R' &&564 message[2] == 'O' && message[3] == 'B' && message[4] == 'E')587 if (0 == strncmp(message, _("PROBE"), 5) || 588 0 == strncmp(message, _("LIST"), 4)) 565 589 { 566 590 strncat (message, _("dummy"), SH_MAXMSG -strlen(message) - 1); 567 591 message[SH_MAXMSG-1] = '\0'; 568 592 } 569 else if (message[0] == 'L' && message[1] == 'I' &&570 message[2] == 'S' && message[3] == 'T')571 {572 strncat (message, _("dummy"), SH_MAXMSG -strlen(message) - 1);573 message[SH_MAXMSG-1] = '\0';574 }575 593 else 576 594 { 577 595 fprintf(stderr, "%s", _("ERROR: this command requires a hostname\n")); 578 usage(argv[0]); 579 return (EXIT_FAILURE); 580 } 581 } 582 583 fixup_message(message); 584 585 /* OpenBSD wants >= 1024 586 */ 587 if (NULL == getcwd(clientcd, 1024)) 588 { 589 perror(_("ERROR: getcwd")); 590 return (EXIT_FAILURE); 591 } 592 size = strlen(clientcd) + 1 + strlen(CLIENT) + 6; 593 sockname = calloc(1,size); 594 if (!sockname) 595 { 596 perror(_("ERROR: main: malloc")); 597 return (EXIT_FAILURE); 598 } 599 #ifdef HAVE_VSNPRINTF 600 snprintf(sockname, size, _("%s/%s.sock"), clientcd, CLIENT); 601 #else 602 sprintf(sockname, _("%s/%s.sock"), clientcd, CLIENT); 603 #endif 596 print_usage_and_exit(argv[0], EXIT_FAILURE); 597 } 598 } 599 600 if (fixup_message(message) < 0) 601 return (EXIT_FAILURE); 604 602 605 603 /* Make the socket. 606 604 */ 607 sock = make_named_socket (sockname);605 sock = create_unix_socket (); 608 606 if (sock < 0) 609 { 610 return (EXIT_FAILURE); 611 } 607 return (EXIT_FAILURE); 612 608 613 609 /* Set up termination handler. … … 630 626 /* Wait for a reply. 631 627 */ 632 if (message[0] == 'L' && message[1] == 'I' && 633 message[2] == 'S' && message[3] == 'T') 634 { 635 if (verbose) 628 if (verbose) 629 { 630 if (0 == strncmp(message, "LIST", 4)) 636 631 fprintf(stdout, "%s", _("# Waiting for listing.\n")); 637 } 638 else 639 { 640 if (verbose) 632 else 641 633 fprintf(stdout, "%s", _("# Waiting for confirmation.\n")); 642 634 } 635 643 636 status = recv_from_server (message); 644 637 645 638 if (status < 0) 646 639 { 647 fp rintf(stderr, "%s", _("ERROR: receiving data from server failed.\n"));640 fputs(_("ERROR: unexpected or no reply from server.\n"), stderr); 648 641 (void) termination_handler(0); 649 642 return (EXIT_FAILURE); -
trunk/src/zAVLTree.c
r474 r481 40 40 } 41 41 42 staticchar * dummy_zfree_string;42 char * dummy_zfree_string; 43 43 #ifdef __clang__ 44 staticchar * dummy_zfree_str;44 char * dummy_zfree_str; 45 45 #endif 46 46 … … 145 145 if (tree->keytype == zAVL_KEY_STRING) 146 146 { 147 return (strcmp((c har*)a, (char *)b));147 return (strcmp((const char*)a, (const char *)b)); 148 148 } 149 149 else /* zAVL_KEY_INT */ 150 150 { 151 int x = *((int *)a);152 int y = *((int *)b);151 const int x = *((const int *)a); 152 const int y = *((const int *)b); 153 153 154 154 if (x > y) return 1;
Note:
See TracChangeset
for help on using the changeset viewer.