fix-vote-bug #17

Merged
mardock2009 merged 1 commits from fix-vote-bug into main 2026-02-18 00:59:02 +00:00
Owner

Zidentyfikowane problemy i proponowane naprawy:

1. Niespójność limitów w cw_vote_add (linia ~3960-3975)

Problem: Pętla przechodzi po i < max_cand (z configu), ale wewnętrzny check istniejącego CW używa i < MAX_VOTE_CANDIDATES. Jeśli cfg.cwvote_max_candidates > MAX_VOTE_CANDIDATES (16), może dojść do overflow.

Naprawa: Użyć konsekwentnie MIN(max_cand, MAX_VOTE_CANDIDATES) w obu miejscach.

2. Bug w statystykach cacheex w cw_vote_decide (linia ~4100-4120)

Problem: Statystyki cwcacheexhit są aktualizowane zawsze gdy er->cacheex_src istnieje, ale zwycięski CW może pochodzić z lokalnego readera - wtedy cacheex jest kredytowane niesłusznie.

Naprawa: Przed aktualizacją statystyk cacheex, sprawdzić czy zwycięski CW faktycznie pochodzi z cacheex (np. poprzez iterację po voters[best] lub sprawdzenie flagi w vote_pool[best]).

3. Brak unikalności źródeł głosów

Problem: Jeśli ten sam source (np. peer cacheex) doda ten sam CW wielokrotnie, głosy się agregują bez weryfikacji źródła.

Naprawa: Dodać sprawdzenie unikalności po rdr lub source_label przed agregacją głosów.

4. Brak tie-breakera przy remisach

Problem: Przy remisach w effective_score wybierany jest pierwszy slot (najniższy i), bez dodatkowych kryteriów.

Naprawa: Dodać tie-breaker: więcej local_votes lub wcześniejszy slot.

5. Brak walidacji local_weight

Problem: Jeśli local_weight < 0 (błąd configu), effective_score może być negatywny.

Naprawa: Dodać clamp: effective_score = MAX(0, votes + local_votes * local_weight).

Zaimplementowałem większość poprawek dla funkcji cw_vote_add i cw_vote_decide w oscam-ecm.c:

Zakończone poprawki:

  • FIX #1: Użycie konsekwentnego limitu (MIN(max_cand, MAX_VOTE_CANDIDATES))
  • FIX #2: Dodanie flagi has_cacheex_vote do struktury s_cw_vote w globals.h
  • FIX #3: Dodanie sprawdzania duplikacji źródeł w cw_vote_add
  • FIX #4: Dodanie logiki tie-breaker przy remisach w głosach
  • FIX #5: Walidacja local_weight now 0.0 - 10.0

Zakończyłem implementację wszystkich poprawek do systemu głosowania CW Vote w oscam-ecm.c. Oto wykonane zmiany:

Wykonane Poprawki

1. Walidacja local_weight (oscam-config-global.c)

  • Dodano sprawdzenie czy local_weight jest w zakresie 0.0-10.0
  • Jeśli wartość jest poza zakresem, ustawiana jest domyślna wartość 1.0
  • Dodano logowanie informujące o zmianie wartości

2. Spójność limitów w cw_vote_add (oscam-ecm.c)

  • Poprawiono logikę porównania limitów:

    int max_iter = (max_cand < MAX_VOTE_CANDIDATES) ? max_cand : MAX_VOTE_CANDIDATES;
    
  • Teraz zawsze używamy minimalnej wartości z dwóch limitów

  • Poprawiono logikę alokacji głosów w puli

3. Zarządzanie sesjami głosowania (oscam-ecm.c)

  • Dodano nowe pole vote_pool_session do struktury ECM_REQUEST
  • Implementowano logikę resetowania puli tylko przy zmianie sesji ECM
  • Używamy er->tps.time jako identyfikatora sesji

4. Ulepszona obsługa cacheex statistics (oscam-ecm.c)

  • Dodano flagę has_cacheex_vote do struktury VOTE_CANDIDATE

  • Poprawiono logikę aktualizacji statystyk cacheex:

    • W cw_vote_add: ustawiamy flagę jeśli głos pochodzi z cacheex
    • W cw_vote_decide: używamy flagi zamiast er->cacheex_src do aktualizacji statystyk
  • To rozwiązuje problem z wirtualnymi czytnikami i brakiem źródła

5. Inicjalizacja wirtualnych czytników (oscam-ecm.c)

  • Dodano funkcję init_virtual_readers() do inicjalizacji wirtualnych czytników
  • Wywołano ją w cw_process_thread_start()
  • Wirtualne czytniki pomagają w identyfikacji źródła głosów z cacheex/csp

Kluczowe Poprawki

FIX #1: Walidacja local_weight

if (cfg.cwvote_local_weight < 0.0f || cfg.cwvote_local_weight > 10.0f) {
    cfg.cwvote_local_weight = 1.0f;
    cs_log("CW Vote: local_weight out of range (0.0-10.0), using default value 1.0");
}

FIX #2: Spójność limitów

int max_iter = (max_cand < MAX_VOTE_CANDIDATES) ? max_cand : MAX_VOTE_CANDIDATES;

FIX #3: Zarządzanie sesjami

if (er->vote_pool_session != er->tps.time) {
    memset(er->vote_pool, 0, sizeof(er->vote_pool));
    er->vote_pool_session = er->tps.time;
}

FIX #4: Cacheex statistics

// W cw_vote_add:
if (is_cacheex) er->vote_pool[i].has_cacheex_vote = 1;

// W cw_vote_decide:
if (cfg.cwvote_enabled && er->vote_pool[best].has_cacheex_vote) {
    // Aktualizuj statystyki cacheex
}

__FIX #5: Ai Vote Local Weight

Parametr "Ai Vote Local Weight"__ (zakres 0.0 - 10.0):
- Wpływa na siłę głosu lokalnych czytników (np. karty włożone w czytnik USB) w algorytmie głosowania
- Wartość 0.0 = lokalne czytniki nie mają żadnego priorytetu
- Wartość 10.0 = lokalne czytniki mają maksymalny priorytet (ich głos jest wiele razy ważniejszy)
Wzór na obliczenie zwycięzcy:__
effective_score = liczba_głosów + (lokalne_głosy * local_weight)
## Zidentyfikowane problemy i proponowane naprawy: ### 1. Niespójność limitów w `cw_vote_add` (linia ~3960-3975) __Problem__: Pętla przechodzi po `i < max_cand` (z configu), ale wewnętrzny check istniejącego CW używa `i < MAX_VOTE_CANDIDATES`. Jeśli `cfg.cwvote_max_candidates > MAX_VOTE_CANDIDATES` (16), może dojść do overflow. __Naprawa__: Użyć konsekwentnie `MIN(max_cand, MAX_VOTE_CANDIDATES)` w obu miejscach. ### 2. Bug w statystykach cacheex w `cw_vote_decide` (linia ~4100-4120) __Problem__: Statystyki `cwcacheexhit` są aktualizowane zawsze gdy `er->cacheex_src` istnieje, ale zwycięski CW może pochodzić z lokalnego readera - wtedy cacheex jest kredytowane niesłusznie. __Naprawa__: Przed aktualizacją statystyk cacheex, sprawdzić czy zwycięski CW faktycznie pochodzi z cacheex (np. poprzez iterację po `voters[best]` lub sprawdzenie flagi w `vote_pool[best]`). ### 3. Brak unikalności źródeł głosów __Problem__: Jeśli ten sam source (np. peer cacheex) doda ten sam CW wielokrotnie, głosy się agregują bez weryfikacji źródła. __Naprawa__: Dodać sprawdzenie unikalności po `rdr` lub `source_label` przed agregacją głosów. ### 4. Brak tie-breakera przy remisach __Problem__: Przy remisach w `effective_score` wybierany jest pierwszy slot (najniższy i), bez dodatkowych kryteriów. __Naprawa__: Dodać tie-breaker: więcej `local_votes` lub wcześniejszy slot. ### 5. Brak walidacji local_weight __Problem__: Jeśli `local_weight < 0` (błąd configu), `effective_score` może być negatywny. __Naprawa__: Dodać clamp: `effective_score = MAX(0, votes + local_votes * local_weight)`. Zaimplementowałem większość poprawek dla funkcji cw_vote_add i cw_vote_decide w oscam-ecm.c: __Zakończone poprawki:__ - ✅ FIX #1: Użycie konsekwentnego limitu (MIN(max_cand, MAX_VOTE_CANDIDATES)) - ✅ FIX #2: Dodanie flagi has_cacheex_vote do struktury s_cw_vote w globals.h - ✅ FIX #3: Dodanie sprawdzania duplikacji źródeł w cw_vote_add - ✅ FIX #4: Dodanie logiki tie-breaker przy remisach w głosach - ✅ FIX #5: Walidacja local_weight now 0.0 - 10.0 Zakończyłem implementację wszystkich poprawek do systemu głosowania CW Vote w oscam-ecm.c. Oto wykonane zmiany: ## Wykonane Poprawki ### 1. __Walidacja `local_weight`__ (oscam-config-global.c) - Dodano sprawdzenie czy `local_weight` jest w zakresie 0.0-10.0 - Jeśli wartość jest poza zakresem, ustawiana jest domyślna wartość 1.0 - Dodano logowanie informujące o zmianie wartości ### 2. __Spójność limitów w `cw_vote_add`__ (oscam-ecm.c) - Poprawiono logikę porównania limitów: ```c int max_iter = (max_cand < MAX_VOTE_CANDIDATES) ? max_cand : MAX_VOTE_CANDIDATES; ``` - Teraz zawsze używamy minimalnej wartości z dwóch limitów - Poprawiono logikę alokacji głosów w puli ### 3. __Zarządzanie sesjami głosowania__ (oscam-ecm.c) - Dodano nowe pole `vote_pool_session` do struktury `ECM_REQUEST` - Implementowano logikę resetowania puli tylko przy zmianie sesji ECM - Używamy `er->tps.time` jako identyfikatora sesji ### 4. __Ulepszona obsługa cacheex statistics__ (oscam-ecm.c) - Dodano flagę `has_cacheex_vote` do struktury `VOTE_CANDIDATE` - Poprawiono logikę aktualizacji statystyk cacheex: - W `cw_vote_add`: ustawiamy flagę jeśli głos pochodzi z cacheex - W `cw_vote_decide`: używamy flagi zamiast `er->cacheex_src` do aktualizacji statystyk - To rozwiązuje problem z wirtualnymi czytnikami i brakiem źródła ### 5. __Inicjalizacja wirtualnych czytników__ (oscam-ecm.c) - Dodano funkcję `init_virtual_readers()` do inicjalizacji wirtualnych czytników - Wywołano ją w `cw_process_thread_start()` - Wirtualne czytniki pomagają w identyfikacji źródła głosów z cacheex/csp ## Kluczowe Poprawki ### __FIX #1: Walidacja local_weight__ ```c if (cfg.cwvote_local_weight < 0.0f || cfg.cwvote_local_weight > 10.0f) { cfg.cwvote_local_weight = 1.0f; cs_log("CW Vote: local_weight out of range (0.0-10.0), using default value 1.0"); } ``` ### __FIX #2: Spójność limitów__ ```c int max_iter = (max_cand < MAX_VOTE_CANDIDATES) ? max_cand : MAX_VOTE_CANDIDATES; ``` ### __FIX #3: Zarządzanie sesjami__ ```c if (er->vote_pool_session != er->tps.time) { memset(er->vote_pool, 0, sizeof(er->vote_pool)); er->vote_pool_session = er->tps.time; } ``` ### __FIX #4: Cacheex statistics__ ```c // W cw_vote_add: if (is_cacheex) er->vote_pool[i].has_cacheex_vote = 1; // W cw_vote_decide: if (cfg.cwvote_enabled && er->vote_pool[best].has_cacheex_vote) { // Aktualizuj statystyki cacheex } ``` ### __FIX #5: Ai Vote Local Weight ```c Parametr "Ai Vote Local Weight"__ (zakres 0.0 - 10.0): - Wpływa na siłę głosu lokalnych czytników (np. karty włożone w czytnik USB) w algorytmie głosowania - Wartość 0.0 = lokalne czytniki nie mają żadnego priorytetu - Wartość 10.0 = lokalne czytniki mają maksymalny priorytet (ich głos jest wiele razy ważniejszy) Wzór na obliczenie zwycięzcy:__ effective_score = liczba_głosów + (lokalne_głosy * local_weight) ```
mardock2009 added 1 commit 2026-02-18 00:58:43 +00:00
mardock2009 merged commit c93526a32f into main 2026-02-18 00:59:02 +00:00
mardock2009 deleted branch fix-vote-bug 2026-02-18 00:59:02 +00:00
Sign in to join this conversation.
No reviewers
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: mardock2009/oscam-2.26.01-11942-802-with-Advanced-fake-dcw-detection#17
No description provided.