Skip to content

Commit

Permalink
Jansson has no support for uint64 and hence we need to convert double…
Browse files Browse the repository at this point in the history
… to uint64

Since there is no clean way to do this

Signed-off-by: Sourav Moitra <[email protected]>
  • Loading branch information
xw19 committed Dec 31, 2024
1 parent 42de7be commit f3bc3cd
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 6 deletions.
22 changes: 18 additions & 4 deletions src/ocispec/json_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,24 @@ json_double_to_uint (double d, unsigned int *converted)
int
json_double_to_uint64 (double d, uint64_t *converted)
{
unsigned long long int ull;
ull = (unsigned long long int) d;
*converted = (uint64_t) ull;
return 0;
// Check for special cases: NaN, infinity, and values outside the representable range of uint64_t
if (isnan(d) || isinf(d) || d < 0 || d > UINT64_MAX) {
// Handle the error case as needed (e.g., return a specific error code)
return -1; // Or another appropriate value
}

// Safely convert double to uint64_t by checking for potential overflows
if (d >= 4294967296.0) { // Check if value is greater than or equal to 2^32
// TODO: Better solution for converting double to uint64
*converted = 0;
char string[20];
sprintf(string, "%0.f", d);
*converted = strtoull(string, NULL, 10);
} else {
// Handle smaller values (less than 2^32)
*converted = (uint64_t) d;
}
return 0;
}

/*
Expand Down
2 changes: 2 additions & 0 deletions src/ocispec/json_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <float.h>
#include <jansson.h>
#include <math.h>

#ifdef __cplusplus
extern "C" {
Expand Down
7 changes: 6 additions & 1 deletion tests/data/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,15 @@
},
"rlimits": [
{
"type": "RLIMIT_NOFILE",
"type": "RLIMIT_CORE",
"hard": 18446744073709551615,
"soft": 18446744073709551615
},
{
"type": "RLIMIT_NOFILE",
"hard": 1024,
"soft": 1024
},
{
"type": "RLIMIT_NPROC",
"hard": 1048576,
Expand Down
2 changes: 1 addition & 1 deletion tests/test-1.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ main ()
exit (6);
if (strcmp (container->process->args[0], "ARGS1") && strcmp (container->process->args[0], container_gen->process->args[0]))
exit (61);
if (container->process->rlimits[0]->hard == hard_limit && container_gen->process->rlimits[0]->hard == container->process->rlimits[0]->hard)
if (container->process->rlimits[0]->hard != hard_limit)
exit (63);
if (strcmp (container->mounts[0]->destination, "/proc") && strcmp (container->mounts[0]->destination, container_gen->mounts[0]->destination))
exit (62);
Expand Down

0 comments on commit f3bc3cd

Please sign in to comment.