Libseccomp: 버그: src/db.c μž¬μž‘μ—…μœΌλ‘œ 인해 A2 μ²˜λ¦¬κ°€ 깨짐

에 λ§Œλ“  2018λ…„ 02μ›” 26일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: seccomp/libseccomp

μ œμ•ˆλœ 이진 트리 μ„±λŠ₯ ν–₯상을 ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄ read() 및 버퍼 크기 인수(A2)에 λŒ€ν•œ λΉ„ν˜„μ‹€μ μΈ κ·œμΉ™ 집합을 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 적어도 이 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œλŠ” src/db.c μž¬μž‘μ—… 컀밋(ce3dda9a1)이 A2 처리λ₯Ό μ€‘λ‹¨ν•œ κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

db μž¬μž‘μ—… 컀밋 전에 read(devzero_fd, buf, 8000) 와 같은 읽기가 -10 λ°˜ν™˜ν–ˆμŠ΅λ‹ˆλ‹€. 이 컀밋 ν›„μ—λŠ” 이제 -5 λ°˜ν™˜ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ 어리석은 read() κ·œμΉ™μ„ μƒμ„±ν•˜λŠ” 데 μ‚¬μš©ν•œ C μ½”λ“œμž…λ‹ˆλ‹€.

        /* read */
        for (i = 5; i <= 12; i++) {
                rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(i), SCMP_SYS(read), 1,
                        SCMP_A2(SCMP_CMP_GT, 4 << i));
                if (rc < 0) {
                        fprintf(stdout, "%s:%d Failed to add read rule %d : rc = %d\n",
                                __FUNCTION__, __LINE__, i, rc);
                        goto error;
                }   
        }   
        rc = seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 1,
                SCMP_A2(SCMP_CMP_LE, 64));
        if (rc < 0) {
                fprintf(stdout, "%s:%d Failed to add read allow rule : rc = %d\n",
                        __FUNCTION__, __LINE__, rc);
                goto error;
        } 

μƒμ„±ν•œ PFCλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  # filter for syscall "read" (0) [priority: 65525]
  if ($syscall == 0)
    if ($a2.hi32 >= 0)
      if ($a2.lo32 > 64)
      else
        action ALLOW;
      if ($a2.lo32 > 16384)
        action ERRNO(12);
      if ($a2.lo32 > 8192)
        action ERRNO(11);
      if ($a2.lo32 > 4096)
        action ERRNO(10);
      if ($a2.lo32 > 2048)
        action ERRNO(9);
      if ($a2.lo32 > 1024)
        action ERRNO(8);
      if ($a2.lo32 > 512)
        action ERRNO(7);
      if ($a2.lo32 > 256)
        action ERRNO(6);
      if ($a2.lo32 > 128)
        action ERRNO(5);
    else
      action ALLOW;
  # default action
  action ERRNO(34);
bug priorithigh

λͺ¨λ“  18 λŒ“κΈ€

그건 κ·Έλ ‡κ³ , λ‚˜λŠ” κ·Όλ³Έ 원인을 돕기 μœ„ν•΄ λ‚΄κ°€ ν•  μˆ˜μžˆλŠ” 일을 ν•  κ²ƒμž…λ‹ˆλ‹€

scmp_bpf_disasm을 μ‚¬μš©ν•˜μ—¬ μ΅œμ‹  libseccompκ°€ 점프λ₯Ό 잘λͺ»λœ μˆœμ„œλ‘œ λ°°μΉ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

머리

 0014: 0x25 0x11 0x00 0x00000080   jgt 128  true:0032 false:0015
 0015: 0x25 0x0f 0x00 0x00000100   jgt 256  true:0031 false:0016
 0016: 0x25 0x0d 0x00 0x00000200   jgt 512  true:0030 false:0017
 0017: 0x25 0x0b 0x00 0x00000400   jgt 1024 true:0029 false:0018
 0018: 0x25 0x09 0x00 0x00000800   jgt 2048 true:0028 false:0019
 0019: 0x25 0x07 0x00 0x00001000   jgt 4096 true:0027 false:0020
 0020: 0x25 0x05 0x00 0x00002000   jgt 8192 true:0026 false:0021
 0021: 0x25 0x03 0x00 0x00004000   jgt 16384 true:0025 false:0022
 0022: 0x25 0x01 0x00 0x00000040   jgt 64   true:0024 false:0023
 0023: 0x06 0x00 0x00 0x7fff0000   ret ALLOW

사전 μž¬μž‘μ—…

 0014: 0x25 0x01 0x00 0x00000040   jgt 64   true:0016 false:0015
 0015: 0x06 0x00 0x00 0x7fff0000   ret ALLOW
 0016: 0x25 0x0f 0x00 0x00004000   jgt 16384 true:0032 false:0017
 0017: 0x25 0x0d 0x00 0x00002000   jgt 8192 true:0031 false:0018
 0018: 0x25 0x0b 0x00 0x00001000   jgt 4096 true:0030 false:0019
 0019: 0x25 0x09 0x00 0x00000800   jgt 2048 true:0029 false:0020
 0020: 0x25 0x07 0x00 0x00000400   jgt 1024 true:0028 false:0021
 0021: 0x25 0x05 0x00 0x00000200   jgt 512  true:0027 false:0022
 0022: 0x25 0x03 0x00 0x00000100   jgt 256  true:0026 false:0023
 0023: 0x25 0x01 0x00 0x00000080   jgt 128  true:0025 false:0024
 0024: 0x06 0x00 0x00 0x00050022   ret ERRNO(34)

ν₯미둜운. λ”°λΌμ„œ PFCλŠ” "μ˜¬λ°”λ₯Έ" κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μƒμ„±λœ BPFλŠ” ... κ±°κΎΈλ‘œμž…λ‹ˆλ‹€. μ΄μƒν•œ. 특히 컀밋이 BPF 생성 μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 점을 κ³ λ €ν•˜λ©΄.

μš°μ„  μˆœμœ„ 값이 μ–΄λ–»κ²Œ λ“  μ—‰λ§μ΄λ˜κ³  μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

λͺ¨ν˜Έν•œ 점 μ£„μ†‘ν•©λ‹ˆλ‹€. PFC(μž¬μž‘μ—… λ³€κ²½ ν›„)도 잘λͺ»λœ μˆœμ„œμž…λ‹ˆλ‹€. μœ„μ— κ²Œμ‹œν•œ PFCλŠ” db.c μž¬μž‘μ—… μ΄μ „μ˜ μˆœμ„œμž…λ‹ˆλ‹€.

HEADμ—μ„œ ν˜„μž¬ μƒμ„±ν•œ PFCλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  # filter for syscall "read" (0) [priority: 65525]
  if ($syscall == 0)
    if ($a2.hi32 >= 0)
      if ($a2.lo32 > 128)
        action ERRNO(5);
      if ($a2.lo32 > 256)
        action ERRNO(6);
      if ($a2.lo32 > 512)
        action ERRNO(7);
      if ($a2.lo32 > 1024)
        action ERRNO(8);
      if ($a2.lo32 > 2048)
        action ERRNO(9);
      if ($a2.lo32 > 4096)
        action ERRNO(10);
      if ($a2.lo32 > 8192)
        action ERRNO(11);
      if ($a2.lo32 > 16384)
        action ERRNO(12);
      if ($a2.lo32 > 64) 
      else
        action ALLOW;
    else
      action ALLOW;
  # default action
  action ERRNO(34);

μ•Œκ² μŠ΅λ‹ˆλ‹€. 쑰금 더 μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” ν™•μ‹€νžˆ db κ³„μΈ΅μ˜ μ–΄λ”˜κ°€μ— μžˆμŠ΅λ‹ˆλ‹€.

μ •ν™•νžˆ 거꾸둜 된 λͺ¨μŠ΅μ΄ μ’€ μ›ƒκΈ°λ„€μš”.

문제λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. 체인 인수 κ΄€λ¦¬μ—μ„œ lvl_nxt 및 lvl_prv의 λ™μž‘μ€ λŒ€κ·œλͺ¨ db.c μž¬μž‘μ—… ν›„ κ΅μ²΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€. _db_tree_add()에 λŒ€ν•œ λͺ‡ 가지 μž‘μ€ λ³€κ²½μœΌλ‘œ 이전 libseccomp λ™μž‘κ³Ό μΌμΉ˜ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μˆ˜μ • 사항이 μžˆλŠ” λΆ„κΈ°μž…λ‹ˆλ‹€.
https://github.com/drakenclimber/libseccomp/tree/issues/112

λ³€κ²½ 사항을 μ •λ¦¬ν•˜κ³  ν…ŒμŠ€νŠΈ ν•œλ‘ 개λ₯Ό μΆ”κ°€ν•œ λ‹€μŒ μ½”λ“œ 적용 λ²”μœ„κ°€ μ΅œλŒ€ μˆ˜μ€€μΈμ§€ ν™•μΈν•©λ‹ˆλ‹€.

였늘 μ•„μΉ¨, μ•„λ§ˆλ„ 당신이 μœ„μ˜ 글을 κ²Œμ‹œ ν•˜κΈ° 직전에 μ‹œκ°„μ„ μ°Ύμ•˜κ³ , 이것을 쑰금 μ‚΄νŽ΄λ³΄κΈ°λ‘œ κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. μˆ˜μ • 사항은 μ•½κ°„ λ‹€λ₯΄μ§€λ§Œ 거의 λ™μΌν•œ 결둠에 λ„λ‹¬ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. κ·€ν•˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λͺ‡ 가지 μΆ”κ°€ μž‘μ—…/정리가 ν•„μš”ν•˜μ§€λ§Œ ν˜„μž¬ μˆ˜μ • 사항은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ§€κΈˆμ€ μ–΄λ–€ μ ‘κ·Ό 방식이 더 λ§ˆμŒμ— λ“œλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 이 뢀뢄에 λŒ€ν•΄ μ’€ 더 생각해봐야겠죠?

흠... 거짓말은 ν•˜μ§€ μ•Šκ² μŠ΅λ‹ˆλ‹€. 이 μ‹œμ μ—μ„œ 두 가지 μˆ˜μ • 사항에 λ§€ν˜Ήλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚΄ 것은 κ°„λ‹¨ν•˜μ§€λ§Œ _db_tree_prune()을 μ™„μ „νžˆ λ¬΄μ‹œν–ˆμŠ΅λ‹ˆλ‹€. μš”μ μ—μ„œ λ§ν–ˆλ“―μ΄ λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

lt() 및 eq() 맀크둜λ₯Ό ν™œμš©ν•˜κΈ° μœ„ν•΄ gt() 맀크둜λ₯Ό λ‹€μ‹œ μž‘μ—…ν•˜λ €λŠ” λ‹Ήμ‹ μ˜ 아이디어가 λ§ˆμŒμ— λ“€μ§€λ§Œ, 특히 lt()λŠ” 닀루기 μ–΄λ €μ›Œμ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. lt()λ₯Ό 인라인 ν•¨μˆ˜λ‘œ λ³€ν™˜ν•˜μ§€ μ•ŠλŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?
νŽΈμ§‘ - 방금 당신이 μš”μ μ—μ„œ λΉ„μŠ·ν•œ μ˜κ²¬μ„ λ§ν•œ 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

이전 libseccomp 및 HEAD에 λŒ€ν•΄ gdbλ₯Ό μ‹€ν–‰ν–ˆκ³  lvl_prv 및 lvl_nxt의 λ™μž‘μ΄ λ³€κ²½λ˜μ—ˆμ§€λ§Œ 우리 μ™Έμ—λŠ” 아무도 λ³Ό 수 μ—†λŠ” λ‚΄λΆ€ λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— 별 λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이 λ‚œλ¦¬λ₯Ό ν”Όμš΄ 것 같은데... 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. λ™μ˜ν•©λ‹ˆλ‹€, λ‚˜λŠ” 그것에 λŒ€ν•΄ μƒκ°ν•΄μ•Όν•©λ‹ˆλ‹€ ;)

흠... 거짓말은 ν•˜μ§€ μ•Šκ² μŠ΅λ‹ˆλ‹€. 이 μ‹œμ μ—μ„œ 두 가지 μˆ˜μ • 사항에 λ§€ν˜Ήλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μ•„λ§ˆλ„ 이전 컀밋에 μ˜ν•΄ 레벨 이 μž¬μ •λ ¬λœ κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ 이것은 λ―Έλ¬˜ν•œ 버그 쀑 ν•˜λ‚˜μ΄μ§€λ§Œ 이와 같이 트리 μˆ˜μ€€μ„ μž¬μ •λ ¬ν•˜λŠ” 데 μ•½κ°„μ˜ λ―Έλ¬˜ν•œ 버그가 μžˆλŠ” 것이 κ±±μ •λ©λ‹ˆλ‹€.

μ–΄λŠ μͺ½μ΄λ“ , λ ˆλ²¨μ— λŒ€ν•΄ μ›ν•˜λŠ” μˆœμ„œκ°€ 무엇인지 μ΄ν•΄ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. "κ°€μž₯ 큰"이 λ¨Όμ €μž…λ‹ˆκΉŒ, "κ°€μž₯ 큰"이 λ§ˆμ§€λ§‰μž…λ‹ˆκΉŒ? 일단 μ΄ν•΄ν•˜λ©΄ ν…ŒμŠ€νŠΈ/μˆ˜μ •μ„ 진행할 수 μžˆμŠ΅λ‹ˆλ‹€. 이전 2.x λ¦΄λ¦¬μŠ€μ™€μ˜ ν˜Έν™˜μ„± 외에 λ‹€λ₯Έ μ΄μœ κ°€ μ—†λ‹€λ©΄ "κ°€μž₯ 큰" 것이 닡이라고 μƒκ°ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν˜„μž¬λ‘œμ„œλŠ” ν™•μ‹€νžˆ 말할 수 μ—†μŠ΅λ‹ˆλ‹€.

λ‚΄ 것은 κ°„λ‹¨ν•˜μ§€λ§Œ _db_tree_prune()을 μ™„μ „νžˆ λ¬΄μ‹œν–ˆμŠ΅λ‹ˆλ‹€. μš”μ μ—μ„œ λ§ν–ˆλ“―μ΄ λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‘˜ λ‹€ 기본적으둜 μ›μΉ™μ μœΌλ‘œ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 제 것은 λͺ‡ 가지 μΆ”κ°€ 쑰건을 μΆ”κ°€ν•˜κ³  db_chain_lt(x,y) 맀크둜λ₯Ό μ •λ¦¬ν•˜μ—¬ 쑰금 더 λ‚˜μ•„κ°‘λ‹ˆλ‹€.

lt() 및 eq() 맀크둜λ₯Ό ν™œμš©ν•˜κΈ° μœ„ν•΄ gt() 맀크둜λ₯Ό λ‹€μ‹œ μž‘μ—…ν•˜λ €λŠ” λ‹Ήμ‹ μ˜ 아이디어가 λ§ˆμŒμ— λ“€μ§€λ§Œ, 특히 lt()λŠ” 닀루기 μ–΄λ €μ›Œμ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. lt()λ₯Ό 인라인 ν•¨μˆ˜λ‘œ λ³€ν™˜ν•˜μ§€ μ•ŠλŠ” μ΄μœ κ°€ μžˆμŠ΅λ‹ˆκΉŒ?

λŒ€λΆ€λΆ„ 역사적 이유. 그듀은 훨씬 더 λ‹¨μˆœν•œ 맀크둜둜 삢을 μ‹œμž‘ν–ˆμ§€λ§Œ, μ•„λ§ˆλ„ ν•¨μˆ˜κ°€ λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜λŠ” μ§€μ κΉŒμ§€ κ½€ μ„±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 헀더 νŒŒμΌμ— μ •λ§λ‘œ μžˆμ–΄μ•Ό ν•˜λŠ”μ§€ ν‰κ°€ν•˜λŠ” 것도 쒋을 것이라고 μƒκ°ν•©λ‹ˆλ‹€. src/db.cμ—μ„œλ§Œ μ‚¬μš©λœλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

이전 libseccomp 및 HEAD에 λŒ€ν•΄ gdbλ₯Ό μ‹€ν–‰ν–ˆκ³  lvl_prv 및 lvl_nxt의 λ™μž‘μ΄ λ³€κ²½λ˜μ—ˆμ§€λ§Œ 우리 μ™Έμ—λŠ” 아무도 λ³Ό 수 μ—†λŠ” λ‚΄λΆ€ λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— 별 λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ„€, λ‚΄λΆ€ μƒνƒœ/νŠΈλ¦¬μž…λ‹ˆλ‹€. μ €λŠ” 그것에 λŒ€ν•΄ λ³„λ‘œ κ±±μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ€‘μš”ν•œ 것은 μƒμ„±λœ ν•„ν„°μ˜ μ •ν™•μ„±μž…λ‹ˆλ‹€.

이 λ‚œλ¦¬λ₯Ό ν”Όμš΄ 것 같은데... 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. λ™μ˜ν•©λ‹ˆλ‹€, λ‚˜λŠ” 그것에 λŒ€ν•΄ μƒκ°ν•΄μ•Όν•©λ‹ˆλ‹€ ;)

ν—€. ν•˜λ£¨λ‚˜ 이틀 정도 μ‹œκ°„μ„ 두고 λ‹€μ‹œ κ·Έλ£Ήν™”ν•©μ‹œλ‹€. :) μ§€κΈˆμ€ 릴리슀된 버전에 영ν–₯을 주지 μ•Šκ³  λ§ˆμŠ€ν„° λΈŒλžœμΉ˜μ—λ§Œ μžˆμœΌλ―€λ‘œ 문제λ₯Ό λ°”λ‘œμž‘μ„ μ‹œκ°„μ΄ μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ 이것은 릴리슀된 버전에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ©° λ§ˆμŠ€ν„° λΈŒλžœμΉ˜μ—λ§Œ μžˆμœΌλ―€λ‘œ 문제λ₯Ό λ°”λ‘œμž‘μ„ μ‹œκ°„μ΄ μžˆμŠ΅λ‹ˆλ‹€.

잘 λ“€λ¦°λ‹€. κ³„νšμ„ κ΅¬μƒν•˜λŠ” λ™μ•ˆ λͺ‡ 가지 ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ³Όκ²Œ

ν˜„μž¬ seccomp A2 처리λ₯Ό ν‰κ°€ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. 전체 ν”„λ‘œκ·Έλž¨μ€ λ‹€μŒμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

https://gist.github.com/drakenclimber/3c6b45ecd973ee495281ef225fa5e54a

κ°„λ‹¨νžˆ λ§ν•΄μ„œ, 보닀 큼 κ·œμΉ™μ€ "μ΅œμ’… 생성" "졜초 처리" μˆœμ„œλ‘œ μƒμ„±λ©λ‹ˆλ‹€.

  • > κ·œμΉ™μ΄ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 생성 λ˜λŠ” ν•„ν„°μ˜ 경우, 예λ₯Ό λ“€μ–΄
    seccomp_rule_add(ctx, action1, syscall, 1, SCMP(SCMP_CMP_GT, 10)
    seccomp_rule_add(ctx, action2, syscall, 1, SCMP(SCMP_CMP_GT, 20)
    seccomp_rule_add(ctx, action3, syscall, 1, SCMP(SCMP_CMP_GT. 30)
    그러면 ν•„ν„°κ°€ μΌκ΄€λœ λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄
if (A2 > 30)
    do action3
if (A2 > 20)
    do action2
if (A2 > 10)
    do action1
  • > κ·œμΉ™μ΄ λ‚΄λ¦Όμ°¨μˆœ 으둜 생성 λ˜λŠ” ν•„ν„°μ˜ 경우, 예λ₯Ό λ“€μ–΄
    seccomp_rule_add(ctx, action3, syscall, 1, SCMP(SCMP_CMP_GT, 30)
    seccomp_rule_add(ctx, action2, syscall, 1, SCMP(SCMP_CMP_GT, 20)
    seccomp_rule_add(ctx, action1, syscall, 1, SCMP(SCMP_CMP_GT. 10)
    그러면 ν•„ν„°κ°€ μƒμ„±λ˜μ§€λ§Œ μ΄μƒν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€. λ°λ“œ μ½”λ“œκ°€ μƒμ„±λ©λ‹ˆλ‹€. λ§ˆμ§€λ§‰ 두 if 문에 μ—°κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
if (A2 > 10)
    do action1
if (A2 > 20)
    do action2
if (A2 > 30)
    do action1
  • μ—¬λŸ¬ < A2 μž‘μ—…μ΄ μžˆλŠ” ν•„ν„°λŠ” ν˜„μž¬ seccompμ—μ„œ ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. <= λ₯Ό μœ„μ˜ > 필터와 λ™μΌν•˜κ²Œ λ§Œλ“œλŠ” 방법을 μ•Œμ•„λ‚Ό 수 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— 이것은 이상해 λ³΄μž…λ‹ˆλ‹€.
tom<strong i="43">@OracleDesktop</strong> $ ./a2test 3
Failed to add rule
        action = 0x5000e op = 0x3 datum = 18000 rc = -17
Mode 3 (LE descending) test failed.  rc = -17
tom<strong i="46">@OracleDesktop</strong> $ ./a2test 4
Failed to add rule
        action = 0x50006 op = 0x3 datum = 250 rc = -17
Mode 4 (LE ascending) test failed.  rc = -17

src/db.c 에 κΉŠμˆ™μ΄ λ¬»ν˜€ μžˆλŠ” else if 논리가 < 였λ₯˜λ₯Ό μΌμœΌν‚€λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 예: . λ³€κ²½/κ³ μΉ  κ°€μΉ˜κ°€ μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ λ™μž‘μ„ μΊ‘μ²˜ν•  수 μžˆλ„λ‘ 이 μ½”λ“œ 쀑 일뢀λ₯Ό μžλ™ν™”λœ ν…ŒμŠ€νŠΈλ‘œ λ³€ν™˜ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

쓰여진 λŒ€λ‘œ μ—¬κΈ° 의 μš”μ§€λŠ” μ§€λ‚œμ£Όμ— μΆ”κ°€ν•œ μžλ™ν™” ν…ŒμŠ€νŠΈμ— μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. νŒŒκ³ λ“€μ–΄ κ·Έ 이유λ₯Ό μ•Œμ•„λ‚΄λ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€.

 batch name: 43-sim-a2_order
 test mode:  c
 test type:  bpf-sim
Test 43-sim-a2_order%%001-00001 result:   SUCCESS
Test 43-sim-a2_order%%002-00001 result:   SUCCESS
Test 43-sim-a2_order%%003-00001 result:   SUCCESS
Test 43-sim-a2_order%%004-00001 result:   SUCCESS
Test 43-sim-a2_order%%005-00001 result:   SUCCESS
Test 43-sim-a2_order%%006-00001 result:   SUCCESS
Test 43-sim-a2_order%%007-00001 result:   SUCCESS
Test 43-sim-a2_order%%008-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%009-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%010-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%011-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%012-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%013-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%014-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%015-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%016-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%017-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%018-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%019-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)
Test 43-sim-a2_order%%020-00001 result:   FAILURE bpf_sim resulted in ERRNO(5)

λ‚΄ λ‚˜μœ - μš”μ μ„ 잘λͺ» μ μš©ν–ˆμŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 휴 :)

ν•˜μ•„! :)

λ‚˜λŠ” 그것에 λŒ€ν•΄ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ ν–ˆλ‹€κ³  생각 ν–ˆμ§€λ§Œ κ·Έ λ‹Ήμ‹œμ—λŠ” λ§Žμ€ 것을 가지고 놀고 μžˆμ—ˆκΈ° λ•Œλ¬Έμ— λ‚΄κ°€ 잘λͺ» κΈ°μ–΅ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. 계속 λ΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μ €λŠ” μ—¬μ „νžˆ SELinux와 κ°μ‚¬λ‘œ 인해 μ•½κ°„ ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 컀널이 μ§€κΈˆ -rc5에 있기 λ•Œλ¬Έμ— 병합 전에 μƒˆ μ½”λ“œμ— 쀑단을 λ‘λŠ” μ¦‰μ‹œ 진정될 κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€. μ°½λ¬Έ ...

κ±±μ • 마. 그것은 ν™•μ‹€νžˆ 더 높은 μš°μ„  μˆœμœ„μž…λ‹ˆλ‹€.

λ‚˜λŠ” λ‹€μ–‘ν•œ λΉ„ν˜„μ‹€μ μΈ ν…ŒμŠ€νŠΈλ₯Ό 톡해 λ‹Ήμ‹ μ˜ μš”μ§€λ₯Ό μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것을 κΉ¨λœ¨λ¦¬μ§€ λͺ»ν–ˆμ§€λ§Œ μ§€κΈˆκΉŒμ§€ _db_tree_prune()의 μΌλΆ€λ§Œ μ—°μŠ΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ³€κ²½ 사항이 더 νŽΈμ•ˆν•΄μ§€κΈ° μ‹œμž‘ν–ˆμ§€λ§Œ 쑰금 더 μ‹œκ°„μ„ 듀이고 μ‹ΆμŠ΅λ‹ˆλ‹€.

_db_tree_prune() μ½”λ“œλ₯Ό μ°”λŸ¬λ³΄κ³  깨뜨릴 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. Test 08-sim-subtree_checksλŠ” prune() λ‚΄μ—μ„œ λŒ€λΆ€λΆ„μ˜ μ½”λ“œ 경둜λ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” 데 정말 μ’‹μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ‹Ήμ‹ μ˜ μš”μ μ—μ„œ λ‚˜μ˜¨ λ³€ν™”κ°€ μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

ν’€ λ¦¬ν€˜μŠ€νŠΈ #115λ₯Ό μ œμΆœν–ˆμŠ΅λ‹ˆλ‹€. λ‘€ μ€€λΉ„κ°€ 된 것 κ°™μ•„μš”

이제 ν•΄κ²°ν•΄μ•Ό ν•˜λ―€λ‘œ μ’…λ£Œν•©λ‹ˆλ‹€(μœ„μ˜ 기둝 μ°Έμ‘°).

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰