Commit f9bfa780 authored by unknown's avatar unknown
Browse files

ndb - rel5.1.16 NdbRecAttr print of blob length assumed uint64 aligned buffer

ndb - 5.1.16 uint64 align for ndb_restore
(backport)


ndb/src/ndbapi/NdbRecAttr.cpp:
   ndb - rel5.1.16 NdbRecAttr print of blob length assumed uint64 aligned buffer
  (backport)
ndb/tools/restore/Restore.cpp:
   ndb - 5.1.16 uint64 align for ndb_restore
  (backport)
parent 5a25c67a
Loading
Loading
Loading
Loading
+19 −19
Original line number Diff line number Diff line
@@ -346,24 +346,24 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
        }
	break;
      case NdbDictionary::Column::Blob:
        {
          const NdbBlob::Head* h = (const NdbBlob::Head*)r.aRef();
          out << h->length << ":";
          const unsigned char* p = (const unsigned char*)(h + 1);
          unsigned n = r.arraySize() - sizeof(*h);
          for (unsigned k = 0; k < n && k < h->length; k++)
            out.print("%02X", (int)p[k]);
          j = length;
        }
        break;
      case NdbDictionary::Column::Text:
      {
          const NdbBlob::Head* h = (const NdbBlob::Head*)r.aRef();
          out << h->length << ":";
          const unsigned char* p = (const unsigned char*)(h + 1);
          unsigned n = r.arraySize() - sizeof(*h);
          for (unsigned k = 0; k < n && k < h->length; k++)
        // user defined aRef() may not be aligned to Uint64
        NdbBlob::Head head;
        memcpy(&head, r.aRef(), sizeof(head));
        out << head.length << ":";
        const unsigned char* p = (const unsigned char*)r.aRef() + sizeof(head);
        if (r.arraySize() < sizeof(head))
          out << "***error***"; // really cannot happen
        else {
          unsigned n = r.arraySize() - sizeof(head);
          for (unsigned k = 0; k < n && k < head.length; k++) {
            if (r.getType() == NdbDictionary::Column::Blob)
              out.print("%02X", (int)p[k]);
            else
              out.print("%c", (int)p[k]);
          }
        }
        j = length;
      }
      break;
+6 −1
Original line number Diff line number Diff line
@@ -54,7 +54,12 @@ BackupFile::Twiddle(const AttributeDesc* attr_desc, AttributeData* attr_data, Ui
    return true;
  case 64:
    for(i = 0; i<arraySize; i++){
      attr_data->u_int64_value[i] = Twiddle64(attr_data->u_int64_value[i]);
      // allow unaligned
      char* p = (char*)&attr_data->u_int64_value[i];
      Uint64 x;
      memcpy(&x, p, sizeof(Uint64));
      x = Twiddle64(x);
      memcpy(p, &x, sizeof(Uint64));
    }
    return true;
  default: