diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2024-10-12 11:11:28 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2024-10-12 11:11:28 +0200 |
| commit | da8fdd4955fd24666643915a6728678e9965a0d3 (patch) | |
| tree | 878d7baf68f90e80949bc79a039bda159865821f /src/nissy.c | |
| parent | 14689e29252e608d51c5b52e61e43471d2aa021e (diff) | |
| download | nissy-core-da8fdd4955fd24666643915a6728678e9965a0d3.tar.gz nissy-core-da8fdd4955fd24666643915a6728678e9965a0d3.zip | |
Make writecube safer
Diffstat (limited to '')
| -rw-r--r-- | src/nissy.c | 73 |
1 files changed, 33 insertions, 40 deletions
diff --git a/src/nissy.c b/src/nissy.c index bc608de..d725599 100644 --- a/src/nissy.c +++ b/src/nissy.c | |||
| @@ -5,15 +5,14 @@ | |||
| 5 | #include <stdbool.h> | 5 | #include <stdbool.h> |
| 6 | #include <string.h> | 6 | #include <string.h> |
| 7 | 7 | ||
| 8 | #include "nissy.h" | ||
| 8 | #include "utils/utils.h" | 9 | #include "utils/utils.h" |
| 9 | #include "arch/arch.h" | 10 | #include "arch/arch.h" |
| 10 | #include "core/core.h" | 11 | #include "core/core.h" |
| 11 | #include "solvers/solvers.h" | 12 | #include "solvers/solvers.h" |
| 12 | 13 | ||
| 13 | #include "nissy.h" | ||
| 14 | |||
| 15 | int parse_h48_solver(const char *, uint8_t [static 1], uint8_t [static 1]); | 14 | int parse_h48_solver(const char *, uint8_t [static 1], uint8_t [static 1]); |
| 16 | STATIC int64_t write_result(cube_t, char [static 22]); | 15 | STATIC int64_t write_result(cube_t, char [static NISSY_SIZE_B32]); |
| 17 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], | 16 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], |
| 18 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); | 17 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); |
| 19 | STATIC bool checkdata(const char *, const tableinfo_t *); | 18 | STATIC bool checkdata(const char *, const tableinfo_t *); |
| @@ -107,9 +106,9 @@ distribution_equal( | |||
| 107 | } | 106 | } |
| 108 | 107 | ||
| 109 | STATIC int64_t | 108 | STATIC int64_t |
| 110 | write_result(cube_t cube, char result[static 22]) | 109 | write_result(cube_t cube, char result[static NISSY_SIZE_B32]) |
| 111 | { | 110 | { |
| 112 | writecube("B32", cube, result); | 111 | writecube("B32", cube, NISSY_SIZE_B32, result); |
| 113 | 112 | ||
| 114 | if (!issolvable(cube)) { | 113 | if (!issolvable(cube)) { |
| 115 | LOG("Warning: resulting cube is not solvable\n"); | 114 | LOG("Warning: resulting cube is not solvable\n"); |
| @@ -121,9 +120,9 @@ write_result(cube_t cube, char result[static 22]) | |||
| 121 | 120 | ||
| 122 | int64_t | 121 | int64_t |
| 123 | nissy_compose( | 122 | nissy_compose( |
| 124 | const char cube[static 22], | 123 | const char cube[static NISSY_SIZE_B32], |
| 125 | const char permutation[static 22], | 124 | const char permutation[static NISSY_SIZE_B32], |
| 126 | char result[static 22] | 125 | char result[static NISSY_SIZE_B32] |
| 127 | ) | 126 | ) |
| 128 | { | 127 | { |
| 129 | cube_t c, p, res; | 128 | cube_t c, p, res; |
| @@ -156,14 +155,14 @@ nissy_compose( | |||
| 156 | return write_result(res, result); | 155 | return write_result(res, result); |
| 157 | 156 | ||
| 158 | nissy_compose_error: | 157 | nissy_compose_error: |
| 159 | writecube("B32", ZERO_CUBE, result); | 158 | writecube("B32", ZERO_CUBE, NISSY_SIZE_B32, result); |
| 160 | return err; | 159 | return err; |
| 161 | } | 160 | } |
| 162 | 161 | ||
| 163 | int64_t | 162 | int64_t |
| 164 | nissy_inverse( | 163 | nissy_inverse( |
| 165 | const char cube[static 22], | 164 | const char cube[static NISSY_SIZE_B32], |
| 166 | char result[static 22] | 165 | char result[static NISSY_SIZE_B32] |
| 167 | ) | 166 | ) |
| 168 | { | 167 | { |
| 169 | cube_t c, res; | 168 | cube_t c, res; |
| @@ -188,15 +187,15 @@ nissy_inverse( | |||
| 188 | return write_result(res, result); | 187 | return write_result(res, result); |
| 189 | 188 | ||
| 190 | nissy_inverse_error: | 189 | nissy_inverse_error: |
| 191 | writecube("B32", ZERO_CUBE, result); | 190 | writecube("B32", ZERO_CUBE, NISSY_SIZE_B32, result); |
| 192 | return err; | 191 | return err; |
| 193 | } | 192 | } |
| 194 | 193 | ||
| 195 | int64_t | 194 | int64_t |
| 196 | nissy_applymoves( | 195 | nissy_applymoves( |
| 197 | const char cube[static 22], | 196 | const char cube[static NISSY_SIZE_B32], |
| 198 | const char *moves, | 197 | const char *moves, |
| 199 | char result[static 22] | 198 | char result[static NISSY_SIZE_B32] |
| 200 | ) | 199 | ) |
| 201 | { | 200 | { |
| 202 | cube_t c, res; | 201 | cube_t c, res; |
| @@ -227,15 +226,15 @@ nissy_applymoves( | |||
| 227 | return write_result(res, result); | 226 | return write_result(res, result); |
| 228 | 227 | ||
| 229 | nissy_applymoves_error: | 228 | nissy_applymoves_error: |
| 230 | writecube("B32", ZERO_CUBE, result); | 229 | writecube("B32", ZERO_CUBE, NISSY_SIZE_B32, result); |
| 231 | return err; | 230 | return err; |
| 232 | } | 231 | } |
| 233 | 232 | ||
| 234 | int64_t | 233 | int64_t |
| 235 | nissy_applytrans( | 234 | nissy_applytrans( |
| 236 | const char cube[static 22], | 235 | const char cube[static NISSY_SIZE_B32], |
| 237 | const char transformation[static 12], | 236 | const char transformation[static NISSY_SIZE_TRANSFORMATION], |
| 238 | char result[static 22] | 237 | char result[static NISSY_SIZE_B32] |
| 239 | ) | 238 | ) |
| 240 | { | 239 | { |
| 241 | cube_t c, res; | 240 | cube_t c, res; |
| @@ -260,14 +259,14 @@ nissy_applytrans( | |||
| 260 | return write_result(res, result); | 259 | return write_result(res, result); |
| 261 | 260 | ||
| 262 | nissy_applytrans_error: | 261 | nissy_applytrans_error: |
| 263 | writecube("B32", ZERO_CUBE, result); | 262 | writecube("B32", ZERO_CUBE, NISSY_SIZE_B32, result); |
| 264 | return err; | 263 | return err; |
| 265 | } | 264 | } |
| 266 | 265 | ||
| 267 | int64_t | 266 | int64_t |
| 268 | nissy_frommoves( | 267 | nissy_frommoves( |
| 269 | const char *moves, | 268 | const char *moves, |
| 270 | char result[static 22] | 269 | char result[static NISSY_SIZE_B32] |
| 271 | ) | 270 | ) |
| 272 | { | 271 | { |
| 273 | cube_t res; | 272 | cube_t res; |
| @@ -290,7 +289,7 @@ nissy_frommoves( | |||
| 290 | return write_result(res, result); | 289 | return write_result(res, result); |
| 291 | 290 | ||
| 292 | nissy_frommoves_error: | 291 | nissy_frommoves_error: |
| 293 | writecube("B32", ZERO_CUBE, result); | 292 | writecube("B32", ZERO_CUBE, NISSY_SIZE_B32, result); |
| 294 | return err; | 293 | return err; |
| 295 | } | 294 | } |
| 296 | 295 | ||
| @@ -304,7 +303,6 @@ nissy_convert( | |||
| 304 | ) | 303 | ) |
| 305 | { | 304 | { |
| 306 | cube_t c; | 305 | cube_t c; |
| 307 | int ret; | ||
| 308 | int64_t err; | 306 | int64_t err; |
| 309 | 307 | ||
| 310 | if (format_in == NULL) { | 308 | if (format_in == NULL) { |
| @@ -327,28 +325,15 @@ nissy_convert( | |||
| 327 | 325 | ||
| 328 | c = readcube(format_in, cube_string); | 326 | c = readcube(format_in, cube_string); |
| 329 | 327 | ||
| 330 | if (iserror(c)) { | ||
| 331 | err = NISSY_ERROR_INVALID_CUBE; | ||
| 332 | goto nissy_convert_error; | ||
| 333 | } | ||
| 334 | |||
| 335 | ret = writecube(format_out, c, result); | ||
| 336 | |||
| 337 | if (ret != 0) { | ||
| 338 | /* Assume the format was invalid */ | ||
| 339 | err = NISSY_ERROR_INVALID_FORMAT; | ||
| 340 | goto nissy_convert_error; | ||
| 341 | } | ||
| 342 | |||
| 343 | if (!isconsistent(c)) { | 328 | if (!isconsistent(c)) { |
| 344 | err = NISSY_ERROR_UNKNOWN; | 329 | err = NISSY_ERROR_INVALID_CUBE; |
| 345 | goto nissy_convert_error; | 330 | goto nissy_convert_error; |
| 346 | } | 331 | } |
| 347 | 332 | ||
| 348 | return NISSY_OK; | 333 | return writecube(format_out, c, result_size, result); |
| 349 | 334 | ||
| 350 | nissy_convert_error: | 335 | nissy_convert_error: |
| 351 | /* We don't write anything to result, we don't know the format */ | 336 | result[0] = '\0'; |
| 352 | return err; | 337 | return err; |
| 353 | } | 338 | } |
| 354 | 339 | ||
| @@ -359,7 +344,7 @@ nissy_getcube( | |||
| 359 | int64_t cp, | 344 | int64_t cp, |
| 360 | int64_t co, | 345 | int64_t co, |
| 361 | const char *options, | 346 | const char *options, |
| 362 | char result[static 22] | 347 | char result[static NISSY_SIZE_B32] |
| 363 | ) | 348 | ) |
| 364 | { | 349 | { |
| 365 | int i; | 350 | int i; |
| @@ -498,7 +483,7 @@ nissy_checkdata( | |||
| 498 | 483 | ||
| 499 | int64_t | 484 | int64_t |
| 500 | nissy_solve( | 485 | nissy_solve( |
| 501 | const char cube[static 22], | 486 | const char cube[static NISSY_SIZE_B32], |
| 502 | const char *solver, | 487 | const char *solver, |
| 503 | uint8_t nissflag, | 488 | uint8_t nissflag, |
| 504 | int8_t minmoves, | 489 | int8_t minmoves, |
| @@ -671,6 +656,14 @@ nissy_explainerror( | |||
| 671 | "is NULL.\n", NISSY_ERROR_NULL_POINTER | 656 | "is NULL.\n", NISSY_ERROR_NULL_POINTER |
| 672 | ); | 657 | ); |
| 673 | return NISSY_OK; | 658 | return NISSY_OK; |
| 659 | case NISSY_ERROR_BUFFER_SIZE: | ||
| 660 | write( | ||
| 661 | "The value %" PRId64 " means that one of the buffers " | ||
| 662 | "provided is too small. For example, it could be too " | ||
| 663 | "small to hold the result or too small to hold the data " | ||
| 664 | "generated by gendata.\n", NISSY_ERROR_BUFFER_SIZE | ||
| 665 | ); | ||
| 666 | return NISSY_OK; | ||
| 674 | case NISSY_ERROR_DATA: | 667 | case NISSY_ERROR_DATA: |
| 675 | write( | 668 | write( |
| 676 | "The value %" PRId64 " means that the provided data is " | 669 | "The value %" PRId64 " means that the provided data is " |
