constraints.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include <asn_internal.h>
  2. #include <constraints.h>
  3. int
  4. asn_generic_no_constraint(const asn_TYPE_descriptor_t *type_descriptor,
  5. const void *struct_ptr,
  6. asn_app_constraint_failed_f *cb, void *key) {
  7. (void)type_descriptor; /* Unused argument */
  8. (void)struct_ptr; /* Unused argument */
  9. (void)cb; /* Unused argument */
  10. (void)key; /* Unused argument */
  11. /* Nothing to check */
  12. return 0;
  13. }
  14. int
  15. asn_generic_unknown_constraint(const asn_TYPE_descriptor_t *type_descriptor,
  16. const void *struct_ptr,
  17. asn_app_constraint_failed_f *cb, void *key) {
  18. (void)type_descriptor; /* Unused argument */
  19. (void)struct_ptr; /* Unused argument */
  20. (void)cb; /* Unused argument */
  21. (void)key; /* Unused argument */
  22. /* Unknown how to check */
  23. return 0;
  24. }
  25. struct errbufDesc {
  26. const asn_TYPE_descriptor_t *failed_type;
  27. const void *failed_struct_ptr;
  28. char *errbuf;
  29. size_t errlen;
  30. };
  31. static void
  32. _asn_i_ctfailcb(void *key, const asn_TYPE_descriptor_t *td, const void *sptr,
  33. const char *fmt, ...) {
  34. struct errbufDesc *arg = key;
  35. va_list ap;
  36. ssize_t vlen;
  37. ssize_t maxlen;
  38. arg->failed_type = td;
  39. arg->failed_struct_ptr = sptr;
  40. maxlen = arg->errlen;
  41. if(maxlen <= 0)
  42. return;
  43. va_start(ap, fmt);
  44. vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap);
  45. va_end(ap);
  46. if(vlen >= maxlen) {
  47. arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */
  48. arg->errlen = maxlen - 1; /* Not counting termination */
  49. return;
  50. } else if(vlen >= 0) {
  51. arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */
  52. arg->errlen = vlen; /* Not counting termination */
  53. } else {
  54. /*
  55. * The libc on this system is broken.
  56. */
  57. vlen = sizeof("<broken vsnprintf>") - 1;
  58. maxlen--;
  59. arg->errlen = vlen < maxlen ? vlen : maxlen;
  60. memcpy(arg->errbuf, "<broken vsnprintf>", arg->errlen);
  61. arg->errbuf[arg->errlen] = 0;
  62. }
  63. return;
  64. }
  65. int
  66. asn_check_constraints(const asn_TYPE_descriptor_t *type_descriptor,
  67. const void *struct_ptr, char *errbuf, size_t *errlen) {
  68. struct errbufDesc arg;
  69. int ret;
  70. arg.failed_type = 0;
  71. arg.failed_struct_ptr = 0;
  72. arg.errbuf = errbuf;
  73. arg.errlen = errlen ? *errlen : 0;
  74. ret = type_descriptor->encoding_constraints.general_constraints(
  75. type_descriptor, struct_ptr, _asn_i_ctfailcb, &arg);
  76. if(ret == -1 && errlen) *errlen = arg.errlen;
  77. return ret;
  78. }